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

pengguna3443794
sumber
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.

pengguna3443794
sumber
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

Parth Solanki
sumber
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

Dhruv
sumber
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'
karthik
sumber
4

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

dataType: "json",
contentType:'application/json'
Dulith De Costa
sumber
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.

Arjun Duggal
sumber
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),
Nalan Madheswaran
sumber
1

Beberapa kali Charset Metada merusak json saat mengirim permintaan. Lebih baik, jangan gunakan charset = utf8 dalam jenis permintaan.

Murali Gundappan
sumber
2
utf8 bukanlah kumpulan karakter yang valid. Lihatlah spesifikasi: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch
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
javaPlease42
sumber
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

TiyebM
sumber
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".

Rahul Rastogi
sumber
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.

spajdo.dll
sumber
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.

Jero Dungog
sumber
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);
    }
}
Jéjé
sumber
0

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

BHARATHWAJ
sumber