Http 415 Kesalahan jenis media yang tidak didukung dengan JSON


115

Saya memanggil layanan REST dengan permintaan JSON dan merespons dengan HTTP 415 "Unsupported Media Type"kesalahan.

Jenis konten permintaan diatur ke ("Content-Type", "application/json; charset=utf8").

Ini berfungsi dengan baik jika saya tidak menyertakan objek JSON dalam permintaan. Saya menggunakan google-gson-2.2.4perpustakaan untuk JSON.

Saya mencoba menggunakan beberapa pustaka yang berbeda tetapi tidak ada bedanya.

Adakah yang bisa membantu saya untuk menyelesaikan ini?

Ini kode saya:

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;

}
}

Nilai requestJson.toString()adalah:

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


Perbarui pertanyaan Anda dengan nilairequestJson.toString()
Sabuj Hassan

1
Nilai requestJson.toString adalah: {"type": "arl", "action": "remove", "domain": "staging", "objects": " abc.com "}
user3443794

Sudahkah Anda menulis bagian server? Jika Anda melakukan permintaan yang sama dengan Postman (ekstensi Chrome, Google itu), apakah itu berhasil? Mungkin server tidak menerima tipe konten JSON karena alasan tertentu?
joscarsson

Ya, saya mengujinya menggunakan soapUI. Saya mengirim permintaan yang sama persis termasuk json dan mendapat respons yang berhasil dari server.
pengguna3443794

@joscarsson, sejak 14 Mar 2017, ekstensi chrome Postman tidak digunakan lagi. Mereka pindah ke aplikasi asli. Ini adalah posting blog mereka: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

Jawaban:


81

Tidak yakin tentang alasannya tetapi Menghapus baris charset=utf8dari con.setRequestProperty("Content-Type", "application/json; charset=utf8")menyelesaikan masalah.


Ini mungkin bug di layanan ReST. Mereka mungkin tidak diharapkan charsetuntuk disetel dalam Jenis Konten. Dugaan saya adalah mereka memeriksa apakah stringnya "application/json; charset=utf-8" == "application/json". Karena itu, JSON harus utf-8 jadi benar-benar valid untuk mengabaikan charset.
Tim Martin

20
Karena charset=utf8bukan sebutan himpunan karakter yang valid. Versi yang benar adalah charset=utf-8. Tanda hubung itu penting. Daftar penunjukan himpunan karakter yang valid dikelola oleh IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

Membuang banyak waktu untuk mencoba berbagai hal dan kemudian mencoba menghapus charset = utf8 dan berhasil. Terima kasih.
Salman

53

Tambahkan Content-Type: application/jsondan Accept:application/json


1
Jika Anda menggunakan Postman untuk pengujian, coba tambahkan bagian ini ke Headers : Content-Type: application / json
Z3d4s

13

Ini karena charset=utf8harus tanpa spasi setelahnya application/json. Itu akan bekerja dengan baik. Gunakan seperti ituapplication/json;charset=utf-8


Ini tidak benar; spasi diperbolehkan dan harus diabaikan; lihat tools.ietf.org/html/rfc2046 .
djb

11

Jika Anda membuat request ajax jquery, jangan lupa untuk menambahkan

contentType:'application/json'

4

Jika Anda menggunakan AJAX jQueryRequest, ini adalah keharusan untuk mendaftar. Jika tidak itu akan membuat Anda 415Error.

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

2

Tambahkan manajer header HTTP dan tambahkan di dalamnya nama dan nilai header API Anda. mis. Jenis konten, Terima, dll. Itu akan menyelesaikan masalah Anda.


2

Jika Anda mendapatkan ini di middleware React RSAA atau yang serupa, Tambahkan header:

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


1

Saya memperbaikinya dengan memperbarui Requestkelas yang diterima Kontroler saya.

Saya menghapus anotasi tingkat kelas berikut dari Requestkelas saya di sisi server saya. Setelah itu klien saya tidak mendapatkan error 415.

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

1

Kode status 415 (Jenis Media Tidak Didukung) menunjukkan bahwa server asal menolak untuk melayani permintaan karena muatan dalam format yang tidak didukung oleh metode ini pada sumber daya target. Masalah format mungkin disebabkan oleh Content-Type atau Content-Encoding yang ditunjukkan permintaan, atau sebagai hasil dari pemeriksaan data secara langsung. DOKTER


0

Saya mengirim permintaan istirahat "hapus" dan gagal dengan 415. Saya melihat tipe konten apa yang digunakan server saya untuk menekan api. Dalam kasus saya, ini adalah "application / json", bukan "application / json; charset = utf8".

Jadi tanyakan dari pengembang api Anda Dan sementara itu coba kirim permintaan hanya dengan content-type = "application / json".


0

Saya memiliki masalah yang sama. Masalah saya adalah objek yang rumit untuk serialisasi. Salah satu atribut dari objek saya adalah Map<Object1, List<Object2>>. Saya mengubah atribut ini seperti di List<Object3>mana Object3berisi Object1dan Object2dan semuanya berfungsi dengan baik.


0

Saya tahu ini sudah terlambat untuk membantu OP dengan masalahnya, tetapi bagi kita semua yang baru saja mengalami masalah ini, saya telah memecahkan masalah ini dengan menghapus konstruktor dengan parameter Kelas saya yang dimaksudkan untuk menyimpan data json.


0

Tambahkan MappingJackson2HttpMessageConverter secara manual dalam konfigurasi memecahkan masalah untuk saya:

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

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

0

Alasannya tidak bisa menambahkan "annotation-driven" di file xml servlet operator Anda. dan juga mungkin karena tidak menambahkan sebagai application / json di header

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.