148
votes

I am calling a REST service with a JSON request and it responds with a HTTP 415 "Unsupported Media Type" error.

The request content type is set to ("Content-Type", "application/json; charset=utf8").

It works fine if I don't include a JSON object in the request. I am using the google-gson-2.2.4 library for JSON.

I tried using a couple of different libraries but it made no difference.

Can anybody please help me to resolve this?

Here is my code:

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;

}
}

The value of requestJson.toString() is :

{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}

18
Please update your question with the value of requestJson.toString()Sabuj Hassan
Value of requestJson.toString is : {"type":"arl","action":"remove","domain":"staging","objects":"abc.com"}user3443794
Have you written the server part? If you do the same request with Postman (Chrome extensions, Google it), does it work? Perhaps the server does not accept the JSON content type for some reason?joscarsson
Yes I tested that using soapUI. I sent the exact same request including json and got successful response from the server.user3443794
@joscarsson, since 14 Mar 2017, Postman chrome extension is deprecated. They moved to the native app. Here is their blog post: http://blog.getpostman.com/2017/03/14/going-native/Serge Kishiko

18 Answers

95
votes

Not sure about the reason but Removing lines charset=utf8 from con.setRequestProperty("Content-Type", "application/json; charset=utf8") resolved the issue.

79
votes

Add Content-Type: application/json and Accept: application/json

16
votes

If you are making jquery ajax request, dont forget to add

contentType:'application/json'
14
votes

This is because charset=utf8 should be without a space after application/json. That will work fine. Use it like application/json;charset=utf-8

4
votes

If you are using AJAX jQuery Request this is a must to apply. If not it will throw you 415 Error.

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

If you get this in React RSAA middleware or similar, Add the headers:

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

HttpVerb needs its headers as a dictionary of key-value pairs

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

Add the HTTP header manager and add in it your API's header names and values. e.g. Content-type, Accept, etc. That will resolve your issue.

1
votes

Some times Charset Metada breaks the json while sending in the request. Better, not use charset=utf8 in the request type.

1
votes

I fixed this by updating the Request class that my Controller receives.

I removed the following class level annotation from my Request class on my server side. After that my client didn't get 415 error.

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

The 415 (Unsupported Media Type) status code indicates that the origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource. The format problem might be due to the request's indicated Content-Type or Content-Encoding, or as a result of inspecting the data directly. DOC

0
votes

I was sending "delete" rest request and it failed with 415. I saw what content-type my server uses to hit the api. In my case, It was "application/json" instead of "application/json; charset=utf8".

So ask from your api developer And in the meantime try sending request with content-type= "application/json" only.

0
votes

I had the same issue. My problem was complicated object for serialization. One attribute of my object was Map<Object1, List<Object2>>. I changed this attribute like List<Object3> where Object3 contains Object1 and Object2 and everything works fine.

0
votes

I know this is way too late to help the OP with his problem, but to all of us who is just encountering this problem, I had solved this issue by removing the constructor with parameters of my Class which was meant to hold the json data.

0
votes

Add MappingJackson2HttpMessageConverter manually in configuration solved the problem for me :

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

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

The reason can be not adding "annotation-driven" in your dispatcher servlet xml file. and also it may be due to not adding as application/json in the headers

0
votes

I have also faced this issue when working REST service with a JSON request and it responds with a HTTP 415 "Unsupported Media Type" error. These lines of codes will help you to resolve the issue.

headers: { "Content-Type": "application/json", "accept": "/" },

After that, you should write code to encode the JSON body. For an example,

body: jsonEncode({"username": username, "password": password})

0
votes

Incase if you are giving a post request through Postman then make sure you have choosed these 2 options

1. JSON should be choosed enter image description here

2. Content-Type - application/json

enter image description here