Http 415 Ошибка неподдерживаемого типа носителя с JSON

Я вызываю службу REST с запросом JSON, и она отвечает ошибкой HTTP 415 "Unsupported Media Type".

Тип содержимого запроса установлен на ("Content-Type", "application/json; charset=utf8").

Он отлично работает, если я не включаю в запрос объект JSON. Я использую библиотеку google-gson-2.2.4 для JSON.

Я пробовал использовать несколько разных библиотек, но это не имело значения.

Может ли кто-нибудь помочь мне решить эту проблему?

Вот мой код:

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


person user3443794    schedule 21.03.2014    source источник
comment
Обновите свой вопрос, указав значение requestJson.toString()   -  person Sabuj Hassan    schedule 21.03.2014
comment
Значение requestJson.toString: {type: arl, action: remove, domain: staging, objects: abc.com}   -  person user3443794    schedule 21.03.2014
comment
Вы написали серверную часть? Если вы сделаете тот же запрос с Postman (расширения Chrome, Google it), это сработает? Возможно, сервер по какой-то причине не принимает тип содержимого JSON?   -  person joscarsson    schedule 21.03.2014
comment
Да, я тестировал это с помощью soapUI. Я отправил точно такой же запрос, включая json, и получил успешный ответ от сервера.   -  person user3443794    schedule 21.03.2014
comment
@joscarsson, с 14 марта 2017 года расширение Postman chrome устарело. Они перешли на родное приложение. Вот их сообщение в блоге: http://blog.getpostman.com/2017/03/14/going-native/   -  person Serge Kishiko    schedule 16.07.2018


Ответы (18)


Не уверен в причине, но удаление строк charset=utf8 из con.setRequestProperty("Content-Type", "application/json; charset=utf8") устранило проблему.

person user3443794    schedule 25.03.2014
comment
Вероятно, это ошибка в сервисе ReST. Вероятно, они не ожидали, что charset будет установлен в Content-Type. Я предполагаю, что они проверяют, есть ли строка "application/json; charset=utf-8" == "application/json". При этом JSON должен быть utf-8, поэтому вполне допустимо не указывать кодировку. - person Tim Martin; 28.03.2016
comment
Поскольку charset=utf8 не является допустимым обозначением набора символов. Правильная версия - charset=utf-8. Рывок важен. Список допустимых обозначений набора символов управляется IANA RFC2879: iana.org /assignments/character-sets/character-sets.xhtml - person Berin Loritsch; 06.07.2017
comment
Потратил много времени, пробуя разные вещи, а затем попытался удалить charset = utf8, и это сработало. Спасибо. - person Salman; 07.05.2018
comment
В некоторых реализациях, например в Dart http, charset=UTF-8 - единственный способ его использования. - person VoidMain; 08.11.2020

Добавьте Content-Type: application/json и Accept: application/json

person Parth Solanki    schedule 15.09.2016
comment
Если вы используете Postman для тестирования, попробуйте добавить эту часть в Заголовки: Content-Type: application / json - person Z3d4s; 04.10.2019

Если вы делаете запрос jquery ajax, не забудьте добавить

contentType:'application/json'
person karthik    schedule 13.09.2016

Это потому, что charset=utf8 не должно быть пробела после application/json. Это будет работать нормально. Используйте это как application/json;charset=utf-8

person Dhruv    schedule 17.05.2016
comment
Это неверно; разрешены пробелы, их следует игнорировать; см. tools.ietf.org/html/rfc2046. - person djb; 03.01.2018

Если вы используете AJAX jQuery Request, это необходимо для подачи заявки. В противном случае вы получите 415 ошибку.

dataType: "json",
contentType:'application/json'
person Dulith De Costa    schedule 16.05.2018

Если вы получили это в промежуточном программном обеспечении React RSAA или аналогичном, добавьте заголовки:

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

HttpVerb нужны заголовки как словарь пар ключ-значение.

headers = {'Content-Type': 'application/json', 'charset': 'utf-8'}
person Mahmoud Nasr    schedule 10.02.2021

Добавьте диспетчер HTTP-заголовков и добавьте в него имена и значения заголовков вашего API. например Content-type, Accept и т. Д. Это решит вашу проблему.

person Arjun Duggal    schedule 29.11.2017

Иногда Charset Metada нарушает json при отправке запроса. Лучше не использовать charset = utf8 в типе запроса.

person Murali Gundappan    schedule 08.05.2017
comment
utf8 просто недопустимый набор символов. Посмотрите на спецификацию: iana.org/assignments/character-sets/character -sets.xhtml - person Berin Loritsch; 06.07.2017

Я исправил это, обновив класс Request, который получает мой контроллер.

Я удалил следующую аннотацию уровня класса из моего Request класса на стороне сервера. После этого мой клиент не получал ошибку 415.

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
person javaPlease42    schedule 31.07.2019

Код состояния 415 (неподдерживаемый тип носителя) указывает, что исходный сервер отказывается обслуживать запрос, поскольку полезная нагрузка находится в формате, не поддерживаемом этим методом на целевом ресурсе. Проблема с форматированием может быть связана с указанным в запросе Content-Type или Content-Encoding или в результате непосредственной проверки данных. DOC

person TiyebM    schedule 13.10.2019

Я отправлял запрос на «удаление», и он не удался с 415. Я видел, какой тип контента мой сервер использует для попадания в api. В моем случае это было «application / json» вместо «application / json; charset = utf8».

Так что спросите у своего разработчика api. А пока попробуйте отправить запрос только с content-type = "application / json".

person Rahul Rastogi    schedule 14.04.2016

Я была такая же проблема. Моя проблема была в сложном объекте для сериализации. Одним из атрибутов моего объекта был Map<Object1, List<Object2>>. Я изменил этот атрибут, например, List<Object3>, где Object3 содержит Object1 и Object2, и все работает нормально.

person spajdo    schedule 12.01.2017

Я знаю, что уже слишком поздно, чтобы помочь OP с его проблемой, но для всех нас, кто только что сталкивается с этой проблемой, я решил эту проблему, удалив конструктор с параметрами моего класса, который предназначался для хранения данных json.

person Jero Dungog    schedule 30.08.2017

Добавление MappingJackson2HttpMessageConverter вручную в конфигурации решило проблему для меня:

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

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}
person Jéjé    schedule 31.05.2018

Причина может заключаться в том, что в xml-файл сервлета диспетчера не добавлено "управляемое аннотацией". а также это может быть связано с тем, что не добавлено приложение / json в заголовки

person BHARATHWAJ    schedule 20.07.2018

Я также столкнулся с этой проблемой при работе службы REST с запросом JSON, и она отвечает ошибкой HTTP 415 Unsupported Media Type. Эти строки кодов помогут вам решить проблему.

заголовки: {Content-Type: application / json, accept: /},

После этого следует написать код для кодирования тела JSON. Например,

body: jsonEncode ({имя пользователя: имя пользователя, пароль: пароль})

person tharaka_dil95    schedule 01.11.2020

Если вы отправляете почтовый запрос через Postman, убедитесь, что вы выбрали эти 2 варианта.

1. JSON следует выбрать введите описание изображения здесь

2. Content-Type - application / json

введите описание изображения здесь

person anand krish    schedule 19.07.2021