【发布时间】:2021-11-04 21:54:05
【问题描述】:
我有一个控制器方法应该返回一个复杂的对象:
public class ComplexObject {
public User User {get; set;}
public Job Job {get; set;}
}
public class User {
public string UserId {get; set;}
}
public class Job {
public int Id {get; set;}
}
所以,在我的控制器方法中,我返回的数据如下:
return CreatedAtAction(nameof(GetJob), new { id = jobId }, new ComplexObject { User = new User{ UserId = "hello" }, Job = new Job{ Id = jobId } });
在这里,调用者(一些客户端应用程序,使用 HttpClient)获取一个空的 json 对象。如果我只发回一份工作,或者只是一个用户
return CreatedAtAction(nameof(GetJob), new { id = jobId }, new User { UserId = "hello" });
返回的正文包含我插入的实际对象。
知道我可以做些什么来让完整的ComplexObject 被退回吗?
使用Created 方法和ActionLink 进行了相同的尝试,但故事相同。
完整的控制器方法如下所示(精简到最低限度)
[HttpPost]
[Route("")]
public async Task<IActionResult> Add([FromBody] AddUserParameters obj)
{
if (!ModelState.IsValid)
return GenerateBadRequest();
int jobId = 1;
var result = new ComplexObject { User = new User { UserId = "hello" }, Job = new Job{ Id = jobId } }
return CreatedAtAction(nameof(GetJob), new { id = jobId }, result);
}
[HttpGet]
[Route("Job/{id}")]
public async Task<IActionResult> GetJob(int id, bool includeDependentElements = false)
{
var job = new Job { Id = id };
return Ok(job);
}
对方调用方法如下
public async Task<ComplexObject>> AddUserWithReload(AddUserParameters obj)
{
var response = await httpClient.PostAsJsonAsync($"{apiPath}/{usersPath}", obj).ConfigureAwait(continueOnCapturedContext);
if (response.IsSuccessStatusCode)
{
var resultObj = await response.Content.ReadAsAsync<ComplexObject>().ConfigureAwait(continueOnCapturedContext);
string jobId = response.Headers.Location.Segments.LastOrDefault();
if (int.TryParse(jobId, out int intJobId))
; // do something with it
return resultObj;
}
}
【问题讨论】:
-
@CorentinPane The
CreatedAtActionmethod 由 ASP.NET Core 提供。 -
如果你自己序列化成json,你还会得到一个空的json吗?
-
您可以发布操作吗?
-
我有些不明白。为什么调用者和被调用者调用都返回 CreatedAtAction (并且被调用者只返回用户)?调用者(其客户端)不应该使用 HttpClient 向被调用者(服务器)发出请求吗?能否展示一下服务器控制器以及如何从客户端调用它?
-
@StephanSteiner 你也可以显示 HttpClient 调用吗?