Http 415 JSON ile Desteklenmeyen Ortam türü hatası


115

JSON isteği olan bir REST hizmetini arıyorum ve bir HTTP 415 "Unsupported Media Type"hata ile yanıt veriyor .

İstek içerik türü olarak ayarlandı ("Content-Type", "application/json; charset=utf8").

İsteğe bir JSON nesnesi dahil etmezsem iyi çalışıyor. google-gson-2.2.4JSON için kitaplığı kullanıyorum .

Birkaç farklı kitaplık kullanmayı denedim ama hiçbir fark yaratmadı.

Lütfen bunu çözmeme yardım eden var mı?

İşte kodum:

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;

}
}

Değeri requestJson.toString():

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


Lütfen sorunuzu değeriyle güncelleyinrequestJson.toString()
Sabuj Hassan

1
RequestJson.toString'in değeri: {"type": "arl", "action": "remove", "domain": "staging", "objects": " abc.com "}
user3443794

Sunucu kısmını yazdın mı? Postman ile aynı isteği yaparsanız (Chrome uzantıları, Google it) işe yarıyor mu? Belki sunucu bir nedenden dolayı JSON içerik türünü kabul etmiyordur?
joscarsson

Evet, soapUI kullanarak bunu test ettim. Json dahil aynı isteği gönderdim ve sunucudan başarılı yanıt aldım.
user3443794

@joscarsson, 14 Mar 2017'den beri Postman chrome uzantısı kullanımdan kaldırıldı. Yerel uygulamaya geçtiler. İşte blog gönderileri: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

Yanıtlar:


81

Nedenle ancak Çıkarma hatları hakkında emin değil charset=utf8itibaren con.setRequestProperty("Content-Type", "application/json; charset=utf8")düzeltilen sorunun.


Muhtemelen ReST hizmetindeki bir hatadır. Muhtemelen charsetContent-Type'ta ayarlanması beklenmiyor . Tahminim, dizenin olup olmadığını kontrol ediyorlar "application/json; charset=utf-8" == "application/json". Bununla birlikte JSON, utf-8 olmalıdır, bu nedenle karakter kümesini dışarıda bırakmak tamamen geçerlidir.
Tim Martin

20
Çünkü charset=utf8geçerli bir karakter seti tanımı değil. Doğru versiyon olacaktır charset=utf-8. Kısa çizgi önemlidir. Geçerli karakter kümesi atamalarının listesi IANA RFC2879 tarafından yönetilmektedir: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

Farklı şeyler denemek için çok zaman harcadıktan sonra karakter kümesini = utf8 kaldırmayı denedim ve işe yaradı. Teşekkürler.
Salman

53

Ekle Content-Type: application/jsonve Accept:application/json


1
Eğer kullanılıyorsa Postacı testi için, bu bölümünü eklemeyi deneyin Başlıkları : İçerik-Type: application / json
Z3d4s

13

Bunun nedeni charset=utf8, sonrasında boşluk olmaması gerektiğidir application/json. Bu iyi çalışacak. Gibi kullanapplication/json;charset=utf-8


Bu yanlış; boşluklara izin verilir ve göz ardı edilmelidir; bakınız tools.ietf.org/html/rfc2046 .
djb

11

Jquery ajax isteği yapıyorsanız eklemeyi unutmayın

contentType:'application/json'

4

AJAX jQueryTalep kullanıyorsanız , bu başvurmak için bir zorunluluktur. Aksi takdirde size 415Hata atacaktır .

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

2

HTTP başlık yöneticisini ekleyin ve API'nizin başlık adlarını ve değerlerini buna ekleyin. örn. İçerik türü, Kabul Et, vb. Sorununuzu çözecektir.


2

Bunu React RSAA ara yazılımında veya benzerinde alırsanız, başlıkları ekleyin:

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


1

RequestKontrolcümün aldığı sınıfı güncelleyerek bunu düzelttim .

Ben kaldırıldı benim aşağıdaki sınıf düzeyinde ek açıklama Requestbenim sunucu tarafında sınıfa. Bundan sonra müşterim 415 hatası almadı.

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

1

415 (Desteklenmeyen Ortam Türü) durum kodu, kaynak sunucunun isteğe hizmet vermeyi reddettiğini, çünkü yükün hedef kaynakta bu yöntem tarafından desteklenmeyen bir biçimde olduğunu gösterir. Biçim sorunu, talebin belirtilen İçerik Türü veya İçerik Kodlamasından veya verilerin doğrudan incelenmesinin bir sonucu olabilir. DOC


0

"Silme" isteği gönderiyordum ve 415 ile başarısız oldu. Sunucumun api'ye ulaşmak için hangi içerik türünü kullandığını gördüm. Benim durumumda, "application / json; charset = utf8" yerine "application / json" idi.

API geliştiricinizden isteyin. Bu arada yalnızca content-type = "application / json" ile istek göndermeyi deneyin.


0

Ben de aynı sorunu yaşadım. Benim sorunum serileştirme için karmaşık bir nesneydi. Nesnemin bir özelliği idi Map<Object1, List<Object2>>. Ben gibi bu niteliği değişti List<Object3>nerede Object3bulunur Object1ve Object2ve her şey gayet iyi çalışıyor.


0

Bunun OP'ye sorununda yardımcı olmak için çok geç olduğunu biliyorum, ancak bu sorunla henüz karşılaşan hepimiz için, bu sorunu, json verilerini tutması amaçlanan Class'ımın parametreleriyle kurucuyu kaldırarak çözdüm.


0

MappingJackson2HttpMessageConverter'ı yapılandırmada manuel olarak eklemek benim için sorunu çözdü:

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

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

0

Bunun nedeni, dağıtım programı sunucu uygulaması xml dosyanıza "ek açıklamaya dayalı" eklenmemesi olabilir. ve ayrıca başlıklara application / json eklenmemesinden kaynaklanıyor olabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.