Подтвердить что ты не робот

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

Я звоню в службу REST с запросом JSON и выдает ошибку Http 415 "Неподдерживаемый тип носителя".

Тип содержимого запроса имеет значение ( "Тип контента", "приложение/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.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;

}
}

Значение requestJson.toString:

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

4b9b3361

Ответ 1

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

Ответ 2

Добавить Content-Type: application/json и принять: application/json

Ответ 3

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

Ответ 4

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

contentType:'application/json'

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

Причиной может быть не добавление "аннотаций" в ваш XML файл сервлета диспетчера. а также может быть связано с тем, что в заголовках не добавлено приложение /json

Ответ 13

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

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

Ответ 14

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

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

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

Ответ 15

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