【问题标题】:Http 415 Unsupported Media type error with JSON带有 JSON 的 Http 415 不支持的媒体类型错误
【发布时间】: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/

标签: java json http-status-code-415


【解决方案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一样使用它

    【讨论】:

    【解决方案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。

              【讨论】:

              【解决方案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})

                              【讨论】:

                                猜你喜欢
                                • 2017-07-05
                                • 2015-08-29
                                • 2018-10-13
                                • 2018-07-25
                                • 2016-09-09
                                • 2013-01-16
                                • 1970-01-01
                                • 2017-08-28
                                相关资源
                                最近更新 更多