带有 JSON 的 Http 415 不支持的媒体类型错误
Posted
技术标签:
【中文标题】带有 JSON 的 Http 415 不支持的媒体类型错误【英文标题】:Http 415 Unsupported Media type error with JSON 【发布时间】:2014-04-29 06:33:36 【问题描述】:我正在使用 JSON 请求调用 REST 服务,它以 HTTP 415 "Unsupported Media Type"
错误响应。
请求内容类型设置为("Content-Type", "application/json; charset=utf8")
。
如果我在请求中不包含 JSON 对象,它可以正常工作。我正在为 JSON 使用google-gson-2.2.4
库。
我尝试使用几个不同的库,但没有任何区别。
谁能帮我解决这个问题?
这是我的代码:
public static void main(String[] args) throws Exception
JsonObject requestJson = new JsonObject();
String url = "xxx";
//method call for generating json
requestJson = generateJSON();
URL myurl = new URL(url);
HttpURLConnection con = (HttpURLConnection)myurl.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "application/json; charset=utf8");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("Method", "POST");
OutputStream os = con.getOutputStream();
os.write(requestJson.toString().getBytes("UTF-8"));
os.close();
StringBuilder sb = new StringBuilder();
int HttpResult =con.getResponseCode();
if(HttpResult ==HttpURLConnection.HTTP_OK)
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"utf-8"));
String line = null;
while ((line = br.readLine()) != null)
sb.append(line + "\n");
br.close();
System.out.println(""+sb.toString());
else
System.out.println(con.getResponseCode());
System.out.println(con.getResponseMessage());
public static JsonObject generateJSON () throws MalformedURLException
String s = "http://www.example.com";
s.replaceAll("/", "\\/");
JsonObject reqparam=new JsonObject();
reqparam.addProperty("type", "arl");
reqparam.addProperty("action", "remove");
reqparam.addProperty("domain", "staging");
reqparam.addProperty("objects", s);
return reqparam;
requestJson.toString()
的值为:
"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"
【问题讨论】:
请用requestJson.toString()
的值更新您的问题
requestJson.toString 的值为:"type":"arl","action":"remove","domain":"staging","objects":"abc.com"
服务器部分写了吗?如果您对 Postman(Chrome 扩展程序,谷歌它)执行相同的请求,它是否有效?也许服务器出于某种原因不接受 JSON 内容类型?
是的,我使用soapUI进行了测试。我发送了完全相同的请求,包括 json 并从服务器获得了成功的响应。
@joscarsson,自 2017 年 3 月 14 日起,不推荐使用 Postman chrome 扩展。他们转移到本机应用程序。这是他们的博文:http://blog.getpostman.com/2017/03/14/going-native/
【参考方案1】:
不确定原因,但从con.setRequestProperty("Content-Type", "application/json; charset=utf8")
中删除行charset=utf8
解决了该问题。
【讨论】:
这可能是 ReST 服务中的一个错误。他们可能不希望在 Content-Type 中设置charset
。我的猜测是他们正在检查字符串"application/json; charset=utf-8" == "application/json"
。话虽如此,JSON 必须是 utf-8,因此省略字符集是完全有效的。
因为charset=utf8
不是有效的字符集名称。正确的版本是charset=utf-8
。破折号很重要。有效字符集名称列表由 IANA RFC2879 管理:iana.org/assignments/character-sets/character-sets.xhtml
浪费了很多时间尝试不同的东西,然后尝试删除 charset=utf8 并且它起作用了。谢谢。
在某些实现中,比如 Dart http,charset=UTF-8
是唯一的使用方式。
哪个文件包含这个以便我可以删除它?【参考方案2】:
添加Content-Type
:application/json
和Accept
:application/json
【讨论】:
如果您使用Postman进行测试,请尝试将这部分添加到Headers中:Content-Type: application/json【参考方案3】:如果你正在做 jquery ajax 请求,不要忘记添加
contentType:'application/json'
【讨论】:
【参考方案4】:这是因为charset=utf8
在application/json
之后应该没有空格。那会很好用。像application/json;charset=utf-8
一样使用它
【讨论】:
这是不正确的;空格是允许的,应该被忽略;见tools.ietf.org/html/rfc2046。【参考方案5】:如果您使用AJAX
jQuery
请求,这是必须申请的。如果不是,它会抛出415
错误。
dataType: "json",
contentType:'application/json'
【讨论】:
【参考方案6】:如果你在 React RSAA 中间件或类似的中间件中得到这个, 添加标题:
method: 'POST',
headers:
'Content-Type': 'application/json',
,
body: JSON.stringify(model),
【讨论】:
【参考方案7】:HttpVerb 需要它的头部作为键值对的字典
headers = 'Content-Type': 'application/json', 'charset': 'utf-8'
【讨论】:
【参考方案8】:如果您通过Postman
发出帖子请求,请确保您选择了这两个选项
1. JSON (application/json) 应该选择
2。内容类型 - 应用程序/json
【讨论】:
【参考方案9】:添加 HTTP 标头管理器并在其中添加您的 API 标头名称和值。 例如内容类型、接受等。这将解决您的问题。
【讨论】:
【参考方案10】:有时 Charset Metada 在发送请求时会破坏 json。最好不要在请求类型中使用 charset=utf8。
【讨论】:
utf8 只是不是一个有效的字符集。看规格:iana.org/assignments/character-sets/character-sets.xhtml【参考方案11】:我通过更新我的 Controller 接收到的 Request
类解决了这个问题。
我从服务器端的Request
类中删除了以下类级别注释。之后我的客户没有收到 415 错误。
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
【讨论】:
【参考方案12】:我对 Postman 也有同样的问题。在标题中添加Content-Type: application/json
解决了这个问题。
【讨论】:
【参考方案13】:我正在发送“删除”休息请求,但它以 415 失败。我看到我的服务器使用什么内容类型来访问 api。就我而言,它是“application/json”而不是“application/json; charset=utf8”。
因此请咨询您的 api 开发人员同时尝试仅使用 content-type= "application/json" 发送请求。
【讨论】:
【参考方案14】:我遇到了同样的问题。我的问题是序列化的复杂对象。我的对象的一个属性是Map<Object1, List<Object2>>
。
我将这个属性更改为List<Object3>
,其中Object3
包含Object1
和Object2
,一切正常。
【讨论】:
【参考方案15】:我知道现在帮助 OP 解决他的问题为时已晚,但对于我们所有刚刚遇到这个问题的人来说, 我已经通过删除带有我的 Class 参数的构造函数来解决这个问题,该参数旨在保存 json 数据。
【讨论】:
【参考方案16】:在配置中手动添加 MappingJackson2HttpMessageConverter 解决了我的问题:
@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters)
messageConverters.add(new MappingJackson2HttpMessageConverter());
super.configureMessageConverters(messageConverters);
【讨论】:
【参考方案17】:原因可能是没有在您的调度程序 servlet xml 文件中添加“注释驱动”。也可能是由于没有在标题中添加为 application/json
【讨论】:
【参考方案18】:415(不支持的媒体类型)状态代码表示 源服务器拒绝为请求提供服务,因为有效负载 在目标资源上采用此方法不支持的格式。 格式问题可能是由于请求的指示 Content-Type 或 Content-Encoding,或作为检查的结果 数据直接。 DOC
【讨论】:
【参考方案19】:在处理带有 JSON 请求的 REST 服务时,我也遇到了这个问题,它响应 HTTP 415“不支持的媒体类型”错误。 这些代码行将帮助您解决问题。
标题: "Content-Type": "application/json", "accept": "/" ,
之后,您应该编写代码来对 JSON 正文进行编码。 例如,
body: jsonEncode("username": username, "password": password)
【讨论】:
以上是关于带有 JSON 的 Http 415 不支持的媒体类型错误的主要内容,如果未能解决你的问题,请参考以下文章
带有 XML 参数的 REST 服务操作上的 HTTP 错误 415 不受支持的媒体类型(Jersey + Jetty)
无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)
错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以