I am calling REST service with JSON request and it gives Http 415 "Unsupported Media Type" error.
Request content type is set to ("Content-Type", "application/json; charset=utf8").
It works fine if I don't include Json object in the request. I am using 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.abc.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;
}
}
Value of requestJson.toString is :
{"type":"arl","action":"remove","domain":"staging","objects":"http://www.abc.com"}
Not sure about the reason but Removing lines charset=utf8
from con.setRequestProperty("Content-Type", "application/json; charset=utf8")
resolved the issue.
Add Content-Type: application/json
and Accept: application/json
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
If you are making jquery ajax request, dont forget to add
contentType:'application/json'
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.
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'
Some times Charset Metada breaks the json while sending in the request. Better, not use charset=utf8 in the request type.
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
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.
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.
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.
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);
}
}
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
If you get this in React RSAA middleware or similar,
Add the headers:
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(model),
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