HTTP 415 JSON不支持的媒体类型错误


114

我正在使用JSON请求调用REST服务,并且它会返回HTTP 415 "Unsupported Media Type"错误。

请求内容类型设置为("Content-Type", "application/json; charset=utf8")

如果我在请求中不包含JSON对象,则效果很好。我正在使用google-gson-2.2.4JSON库。

我尝试使用几个不同的库,但这没什么区别。

有人可以帮我解决这个问题吗?

这是我的代码:

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()
Sabuj Hassan 2014年

1
requestJson.toString的值为:{“ type”:“ arl”,“ action”:“ remove”,“ domain”:“ staging”,“ objects:” abc.com “}
user3443794 2014年

您是否已编写服务器部分?如果您对Postman(Chrome扩展程序,Google扩展程序)执行相同的请求,是否可以使用?也许服务器由于某种原因不接受JSON内容类型?
joscarsson

是的,我使用soapUI进行了测试。我发送了包括json在内的完全相同的请求,并从服务器获得成功的响应。
user3443794 2014年

@joscarsson,自2017年3月14日起,已弃用Postman chrome扩展名。他们移到了本机应用程序。这是他们的博客文章:http
Serge Kishiko

Answers:


81

不确定原因,但是charset=utf8从中 删除行con.setRequestProperty("Content-Type", "application/json; charset=utf8")解决了该问题。


这可能是ReST服务中的错误。可能不希望它们charset在Content-Type中设置。我的猜测是他们正在检查字符串"application/json; charset=utf-8" == "application/json"。话虽这么说,JSON必须是utf-8,所以省略字符集是完全有效的。
蒂姆·马丁

19
因为charset=utf8不是有效的字符集指定。正确的版本是charset=utf-8。破折号很重要。有效的字符集名称列表由IANA RFC2879管理:iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

浪费大量时间尝试其他事情,然后尝试删除charset = utf8并成功了。谢谢。
萨尔曼

53

添加Content-Typeapplication/jsonAcceptapplication/json


1
如果您使用Postman进行测试,请尝试将此部分添加到Headers:Content-Type:application / json
Z3d4s

13

这是因为charset=utf8后面应该没有空格application/json。那会很好的。像这样使用application/json;charset=utf-8


这是不正确的。允许使用空格,应将其忽略;请参阅tools.ietf.org/html/rfc2046
djb

11

如果您要发出jQuery Ajax请求,请不要忘记添加

contentType:'application/json'

4

如果您使用的是“ AJAX jQuery请求”,则必须申请。如果不是,它将抛出415错误。

dataType: "json",
contentType:'application/json'




1

我通过更新RequestController收到的类来解决此问题。

我从服务器端的类中删除了以下类级别的注释Request。之后,我的客户没有收到415错误。

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement

1

415(不受支持的媒体类型)状态码表示原始服务器拒绝为请求提供服务,因为有效负载采用的是目标资源上此方法不支持的格式。格式问题可能是由于请求指示的Content-Type或Content-Encoding,或者是直接检查数据的结果。 DOC


0

我正在发送“删除”休息请求,但请求失败,但失败了415。我看到服务器使用哪种内容类型来访问api。就我而言,它是“ application / json”而不是“ application / json; charset = utf8”。

因此,请向您的api开发人员询问,同时尝试仅使用content-type =“ application / json”发送请求。


0

我遇到过同样的问题。我的问题是要序列化的复杂对象。我的对象的一个​​属性是Map<Object1, List<Object2>>。我改变了这样的属性List<Object3>,其中Object3包含Object1Object2一切工作正常。


0

我知道这对帮助OP解决他的问题为时已晚,但是对于我们所有刚遇到此问题的人来说,我已经通过删除构造函数(带有用于保存json数据的Class)的参数来解决了此问题。


0

在配置中手动添加MappingJackson2HttpMessageConverter为我解决了这个问题:

@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}

0

原因可能不是在调度程序servlet xml文件中添加“注释驱动”。也可能是由于未在标头中添加为application / json

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.