Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

Http 415 Unsupported Media type error with JSON

Writer Andrew Mclaughlin

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 = ""; 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":""}

5

20 Answers

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

5

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

1

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

contentType:'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

1

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'

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

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

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

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

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

1. JSON (application/json) should be choosedenter image description here

2. Content-Type - application/json

enter image description here

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.

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

1

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 had the same issue with Postman. Adding Content-Type: application/json to the headers solved the issue.

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

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

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})

I was facing the same issue and the solution was to remove

'mode': 'no-cors'

and adding the hostname as an allowed origin at backend server. Setting mode to 'no-cors' will always take "Content-Type" as "text/plain". For more info, visit info

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy