You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular5调用Spring POST API触发415媒体类型不支持错误

解决Angular 5 + Spring POST请求415媒体类型不支持错误

嘿,我一眼就看出问题所在了——你踩了Angular HttpHeaders 的一个经典坑!

问题根源

Angular的 HttpHeaders 是不可变对象,调用 append() 方法不会修改原headers实例,而是返回一个全新的实例。你原来的代码里只是调用了 headers.append('Content-Type', 'application/json'),但没有把返回值赋值给变量,导致实际发送的请求根本没带上这个请求头!

同时,你手动用 JSON.stringify() 把请求体转成了字符串,Angular看到请求体是字符串类型,会默认把 Content-Type 设置为 text/plain,这就和Spring后端要求的 application/json 不匹配,直接触发了415错误。

解决方案

有两种修复方式,推荐第二种更简洁的:

方式1:正确使用HttpHeaders

如果坚持手动设置headers,一定要接收 append() 的返回值:

postProject(project: Project) {
  // 注意这里用let而不是const,因为要重新赋值
  let headers = new HttpHeaders();
  headers = headers.append('Content-Type', 'application/json');
  // 或者直接用构造函数初始化,更简洁
  // const headers = new HttpHeaders({'Content-Type': 'application/json'});
  
  return this.http.post('http://localhost:8443/projects', project.body(), {headers})
    .pipe(map(response => response)); // Angular 5中map操作符需要包裹在pipe里
}

方式2:让HttpClient自动处理(推荐)

Angular的 HttpClient 会自动帮你把JavaScript对象序列化为JSON,并且自动设置 Content-Type: application/json 请求头,完全不需要手动处理!

首先修改你的 body() 方法,返回对象而不是字符串:

body() {
  return {
    id: this.id,
    name: this.name,
    'num_execs': this.num_execs
  };
}

然后简化post方法:

postProject(project: Project) {
  // 直接传对象,HttpClient会自动处理序列化和请求头
  return this.http.post('http://localhost:8443/projects', project.body())
    .pipe(map(response => response));
}

验证

这样修改后,你的请求会正确带上 Content-Type: application/json,Spring后端的 @RequestBody 就能正常解析请求体,415错误也就消失了。

内容的提问来源于stack exchange,提问作者Carlos Vázquez Losada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:32:47