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

115

Я вызываю службу 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"}

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

Ответы:

81

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

пользователь3443794
источник
Вероятно, это ошибка в сервисе ReST. Они, вероятно, не ожидают, что они charsetбудут установлены в Content-Type. Я предполагаю, что они проверяют, есть ли строка "application/json; charset=utf-8" == "application/json". При этом JSON должен быть utf-8, поэтому вполне допустимо не указывать кодировку.
Тим Мартин
20
Потому что charset=utf8это недопустимое обозначение набора символов. Правильная версия была бы charset=utf-8. Тире важен. Список допустимых обозначений набора символов управляется IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtml
Берин Лорич
Потратил много времени, пробуя разные вещи, а затем попытался удалить charset = utf8, и это сработало. Спасибо.
Салман
53

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

Парф Соланки
источник
1
Если вы используете Postman для тестирования, попробуйте добавить эту часть в заголовки : Content-Type: application / json
Z3d4s
13

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

Dhruv
источник
Это неверно; разрешены пробелы, их следует игнорировать; см. tools.ietf.org/html/rfc2046 .
djb 03
11

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

contentType:'application/json'
Картик
источник
4

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

dataType: "json",
contentType:'application/json'
Дулит Де Коста
источник
2

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

Арджун Дуггал
источник
2

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

  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(model),
Налан Мадхесваран
источник
1

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

Мурали Гундаппан
источник
2
utf8 просто недопустимый набор символов. Посмотрите на спецификацию: iana.org/assignments/character-sets/character-sets.xhtml
Берин Лорич 06
1

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

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

import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
javaPlease42
источник
1

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

TiyebM
источник
0

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

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

Рахул Растоги
источник
0

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

Спайдо
источник
0

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

Джеро Дунгог
источник
0

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

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

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new MappingJackson2HttpMessageConverter());
        super.configureMessageConverters(messageConverters);
    }
}
Jéjé
источник
0

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

БХАРАТВАДЖ
источник