使用 JSON 的 Http 415不支持媒体类型错误

我用一个 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"}

790454 次浏览

不知道原因,但从 con.setRequestProperty("Content-Type", "application/json; charset=utf8")删除行 charset=utf8解决了这个问题。

我发送“删除”休息请求,它失败了与415。我看到了我的服务器用来访问 API 的内容类型。在我的例子中,它是“ application/json”而不是“ application/json; charset = utf8”。

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

这是因为 charset=utf8application/json之后应该没有空格。这样就可以了。像 application/json;charset=utf-8一样使用它

如果您正在进行 jquery ajax 请求,请不要忘记添加

contentType:'application/json'

添加 Content-Type: application/jsonAccept: application/json

我有同样的问题。我的问题是复杂的对象序列化。我的对象的一个属性是 Map<Object1, List<Object2>>。 我修改了这个属性,比如 List<Object3>,其中 Object3包含 Object1Object2,一切正常。

有时 Charset Metada 在发送请求时中断 json。

我知道现在帮 OP 解决他的问题已经太迟了但是对于我们这些刚刚遇到这个问题的人, 我已经解决了这个问题,移除了包含我的 Class 参数的构造函数,这些参数用来保存 json 数据。

添加 HTTP 头管理器,并在其中添加 API 的头名称和值。 例如,内容类型,接受等,这将解决你的问题。

如果您正在使用 AJAX jQuery请求这是一个必须应用。如果没有,它会抛出你的 415错误。

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

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

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


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

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

如果你在 React RSAA 中间件或类似软件中得到这个, 添加标题:

  method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(model),

我通过更新 Controller 接收到的 Request类修复了这个问题。

被移除了下面的类级注释从我的 Request类在我的服务器端。然后我的客户端 没有得到415错误。

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

415(不支持媒体类型)状态代码指示 起源服务器拒绝服务请求,因为有效负载 是目标资源上此方法不支持的格式。 格式问题可能是由于请求的指示 内容类型或内容编码,或检查 直接提供资料。 医生

当使用 JSON 请求处理 REST 服务时,我也遇到过这个问题,它的响应是 HTTP 415“ Unsupport Media Type”错误。 这几行代码将帮助您解决这个问题。

标题: {“ Content-Type”: “ application/json”,“ ept”: “ /”} ,

之后,您应该编写代码对 JSON 主体进行编码。 举个例子,

Body: jsonEncode ({“ username”: username,“ password”: password })

HttpVerb 需要它的头部作为键-值对的字典

headers = {'Content-Type': 'application/json', 'charset': 'utf-8'}

如果你正在通过 Postman发布请求,那么请确保你已经选择了这两个选项

选择 JSON (application/JSON) enter image description here

2. Content-Type -application/json

enter image description here

我对邮递员也有同样的问题。在标题中添加 Content-Type: application/json解决了这个问题。

我当时也面临着同样的问题,解决方法就是移除

'mode': 'no-cors'

并在后端服务器上添加主机名作为允许的起点。 将模式设置为“ no-cors”将始终采用“ Content-Type”作为“ text/plain”。 更多信息,请访问 < a href = “ https://developer.mozilla.org/en-US/docs/Web/API/Request/mode”rel = “ nofollow norefrer”> info

在我的例子中: 在主体参数中,我将参数设置为 text 类型而不是 JSON 我以为都一样。 :)