Angular向ASP.NET Core 6发Post请求报400错误,Postman正常
问题解决:ASP.NET Core 6中前端传参后端接收为null的问题
核心原因
你当前的后端代码用[HttpPost("{Jsondto}")],是期望从URL路由获取Jsondto参数,但前端是把JSON字符串放在请求体里发送的,两者不匹配,导致后端拿到的Jsondto为null。另外之前传对象报400,大概率是后端没正确配置请求体绑定。
推荐方案:直接传递对象(避免手动序列化)
这是最符合RESTful规范的方式,也能解决之前的400错误。
前端代码修改
去掉JSON.stringify,直接传递对象(Angular的HttpClient会自动序列化为JSON并设置正确的Content-Type: application/json请求头):
this.http.post<ProjectDto>(`${baseUrl}Projects/CreateProject`, this.projectCreateInitDto).subscribe({ next: (response: ProjectDto) => { // 处理成功响应逻辑 }, error: (err) => { // 处理错误逻辑 } });
后端代码修改
移除路由中的{Jsondto},用[FromBody]标记参数,让ASP.NET Core自动从请求体绑定并反序列化为目标对象:
[Route("CreateProject")] [HttpPost] public async Task<ActionResult<ProjectAPIDto>> CreateProject([FromBody] ProjectAPICreateInitDto dto) { // 先验证模型有效性 if (!ModelState.IsValid) { return BadRequest(ModelState); } Project project = _mapper.Map<Project>(dto); // 后续业务逻辑(比如保存到数据库等) return Ok(project); // 返回映射后的结果 }
备选方案:坚持传递JSON字符串
如果一定要手动传JSON字符串,需要调整后端参数绑定方式,并确保前端请求头正确。
前端代码修改
手动设置Content-Type: application/json请求头,避免Angular默认把字符串请求的Content-Type设为text/plain:
const headers = new HttpHeaders({ 'Content-Type': 'application/json' }); const dtoAsJson: string = JSON.stringify(this.projectCreateInitDto); this.http.post<ProjectDto>(`${baseUrl}Projects/CreateProject`, dtoAsJson, { headers }).subscribe({ next: (response: ProjectDto) => { // 处理响应逻辑 } });
后端代码修改
用[FromBody]标记字符串参数,然后手动反序列化(推荐用.NET内置的System.Text.Json,或者Newtonsoft.Json):
using System.Text.Json; [Route("CreateProject")] [HttpPost] public async Task<ActionResult<ProjectAPIDto>> CreateProject([FromBody] string Jsondto) { if (string.IsNullOrWhiteSpace(Jsondto)) { return BadRequest("JSON字符串不能为空"); } ProjectAPICreateInitDto dto; try { dto = JsonSerializer.Deserialize<ProjectAPICreateInitDto>(Jsondto); } catch (JsonException) { return BadRequest("JSON格式无效"); } if (dto == null) { return BadRequest("JSON解析失败"); } Project project = _mapper.Map<Project>(dto); // 后续业务逻辑 return Ok(project); }
内容的提问来源于stack exchange,提问作者Yogi Bear
相关产品推荐
相关产品推荐

