我尝试更新项目中工作人员的身份,我使用带有 put 的HttpClient,在Angular 6项目和.NET Core上的Web API 2中工作。您可以在前端看到请求:
updateWorkerIdentity(worker: WorkerRead) : Observable<WorkerRead> {
const url = 'workerinfo/activeContractId=' + worker.activeContract.id;
return this.httpClient.put<WorkerRead>(url , JSON.stringify(worker) );
}
在API方面:
[HttpPut("{activeContractId}")]
public async Task<IActionResult> Put([FromRoute] string activeContractId, [FromBody] WorkerRead worker)
{
var companyId = GetCompanyId();
var period = GetPeriod();
var language = GetLanguage();
var workerInfo = await _workerInfoService.UpdateWorkerIdentity(companyId, activeContractId, language, worker);
return Ok(workerInfo);
}
来自activeContractId
的{{1}}发送得很好,但工作人员仍然为 null 。
从尸体派出的工作人员发送得很好,如您在有效负载中所见:
并且标题的Content-Type很好[FromRoute]
。
有人有主意吗?
答案 0 :(得分:1)
对于一个简单的端点,服务器端的一切看起来都很好。
但是,基于[HttpPut("{activeContractId}")]
路由模板,应将客户端的请求重构为与期望的模板匹配
updateWorkerIdentity(worker: WorkerRead) : Observable<WorkerRead> {
const url = 'workerinfo/' + worker.activeContract.id;
return this.httpClient.put<WorkerRead>(url , worker);
}
我怀疑httpClient
在发送之前会在内部对有效负载进行字符串化。
以上代码假定已定义控制器
[Route("[controller]")]
public class WorkerInfoController : Controller {
//...
//PUT workerinfo/123456
[HttpPut("{activeContractId}")]
public async Task<IActionResult> Put([FromRoute] string activeContractId, [FromBody] WorkerRead worker) {
var companyId = GetCompanyId();
var period = GetPeriod();
var language = GetLanguage();
var workerInfo = await _workerInfoService.UpdateWorkerIdentity(companyId, activeContractId, language, worker);
return Ok(workerInfo);
}
}