带有 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/jsonAccept:application/json

【讨论】:

如果您使用Postman进行测试,请尝试将这部分添加到Headers中:Content-Type: application/json【参考方案3】:

如果你正在做 jquery ajax 请求,不要忘记添加

contentType:'application/json'

【讨论】:

【参考方案4】:

这是因为charset=utf8application/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 包含Object1Object2,一切正常。

【讨论】:

【参考方案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 不支持的媒体类型错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 415 不支持的媒体类型

带有 XML 参数的 REST 服务操作上的 HTTP 错误 415 不受支持的媒体类型(Jersey + Jetty)

无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)

错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以

415 http 媒体类型不支持异常 PUT 方法 Postman

带有多部分请求的 Spring Boot 不受支持的媒体类型