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


Будь ласка, оновіть своє значення зі значеннямrequestJson.toString()
Sabuj Hassan

1
Значення requestJson.toString становить: {"type": "arl", "action": "remove", "domain": "staging", "object": " abc.com "}
user3443794

Ви написали серверну частину? Якщо ви робите такий же запит і з Postman (розширення Chrome, Google it), чи працює він? Можливо, сервер чомусь не приймає тип вмісту JSON?
joscarsson

Так, я перевірив це за допомогою soapUI. Я надіслав такий же запит, включаючи json, і отримав успішну відповідь від сервера.
користувач3443794

@joscarsson, з 14 березня 2017 р. хромове розширення для поштника застаріле. Вони перейшли до нативного додатка. Ось їхній запис у блозі: http://blog.getpostman.com/2017/03/14/going-native/
Сергій Кішико

Відповіді:


81

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


Це, мабуть, помилка в сервісі 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 для тестування, спробуйте додати цю частину до заголовків : Тип вмісту: application / json
Z3d4s

13

Це тому, що після charset=utf8має бути без місця application/json. Це буде добре. Використовуйте це якapplication/json;charset=utf-8


Це неправильно; пробіли дозволені і їх слід ігнорувати; див. tools.ietf.org/html/rfc2046 .
djb

11

Якщо ви робите запит на jquery ajax, не забудьте додати

contentType:'application/json'

4

Якщо ви використовуєте AJAX jQueryЗапит, це необхідно застосувати. Якщо ні, то це викине вам 415помилку.

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

2

Додайте менеджер заголовків HTTP та додайте до нього імена та значення заголовків API. наприклад Тип вмісту, Прийняти тощо. Це вирішить вашу проблему.


2

Якщо ви отримаєте це в середньому програмному забезпеченні React RSAA або подібному, Додайте заголовки:

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


1

Я вирішив це, оновивши Requestклас, який отримує мій контролер.

З мого класу на стороні сервера я видалив наступну анотацію про рівень Requestкласу Після цього мій клієнт не отримав помилку 415.

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

1

Код статусу 415 (непідтримуваний тип медіа) вказує, що сервер-джерело відмовляється обслуговувати запит, оскільки корисне навантаження у форматі, не підтримуваному цим методом на цільовому ресурсі. Проблема з форматом може бути пов’язана із вказаним запитом Тип вмісту або Кодування вмісту або в результаті прямої перевірки даних. DOC


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

Я знаю, що це занадто пізно, щоб допомогти ОП зі своєю проблемою, але для всіх нас, хто тільки стикається з цією проблемою, я вирішив це питання, видаливши конструктор з параметрами мого класу, який мав на меті зберігати дані 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);
    }
}

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.