Http 415 Errore di tipo di supporto non supportato con JSON


115

Sto chiamando un servizio REST con una richiesta JSON e risponde con un HTTP 415 "Unsupported Media Type"errore.

Il tipo di contenuto della richiesta è impostato su ("Content-Type", "application/json; charset=utf8").

Funziona bene se non includo un oggetto JSON nella richiesta. Sto usando la google-gson-2.2.4libreria per JSON.

Ho provato a utilizzare un paio di librerie diverse ma non ha fatto differenza.

Qualcuno può aiutarmi a risolvere questo problema?

Ecco il mio codice:

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;

}
}

Il valore di requestJson.toString()è:

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


Aggiorna la tua domanda con il valorerequestJson.toString()
Sabuj Hassan

1
Il valore di requestJson.toString è: {"type": "arl", "action": "remove", "domain": "staging", "objects": " abc.com "}
user3443794

Hai scritto la parte server? Se fai la stessa richiesta con Postman (estensioni di Chrome, Google it), funziona? Forse il server non accetta il tipo di contenuto JSON per qualche motivo?
joscarsson

Sì, l'ho testato usando soapUI. Ho inviato la stessa identica richiesta, incluso json, e ho ricevuto una risposta positiva dal server.
user3443794

@joscarsson, dal 14 marzo 2017 l'estensione di Chrome Postman è obsoleta. Sono passati all'app nativa. Ecco il loro post sul blog: http://blog.getpostman.com/2017/03/14/going-native/
Serge Kishiko

Risposte:


81

Non sono sicuro circa la ragione, ma la rimozione di linee charset=utf8dal con.setRequestProperty("Content-Type", "application/json; charset=utf8")risolto il problema.


Probabilmente è un bug nel servizio ReST. Probabilmente non ci si aspetta charsetche siano impostati nel Content-Type. La mia ipotesi è che stiano controllando se la stringa "application/json; charset=utf-8" == "application/json". Detto questo, JSON deve essere utf-8, quindi è perfettamente valido tralasciare il set di caratteri.
Tim Martin

20
Perché charset=utf8non è una designazione di set di caratteri valida. La versione corretta sarebbe charset=utf-8. Il trattino è importante. L'elenco delle designazioni di set di caratteri valide è gestito da IANA RFC2879: iana.org/assignments/character-sets/character-sets.xhtml
Berin Loritsch

Ho sprecato un sacco di tempo a provare cose diverse e poi ho provato a rimuovere il set di caratteri = utf8 e ha funzionato. Grazie.
Salman

53

Aggiungi Content-Type: application/jsone Accept:application/json


1
Se utilizzi Postman per i test, prova ad aggiungere questa parte alle intestazioni : Content-Type: application / json
Z3d4s

13

Questo perché charset=utf8dovrebbe essere senza uno spazio dopo application/json. Funzionerà bene. Usalo comeapplication/json;charset=utf-8


Questo non è corretto; gli spazi sono consentiti e dovrebbero essere ignorati; vedere tools.ietf.org/html/rfc2046 .
djb

11

Se stai facendo una richiesta jquery ajax, non dimenticare di aggiungere

contentType:'application/json'

4

Se stai usando AJAX jQueryRichiedi questo è un must per fare domanda. In caso contrario, ti verrà generato un 415errore.

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

2

Aggiungi il gestore dell'intestazione HTTP e aggiungi i nomi e i valori dell'intestazione dell'API. ad es. Tipo di contenuto, Accetta, ecc. Questo risolverà il problema.


2

Se ottieni questo nel middleware React RSAA o simile, aggiungi le intestazioni:

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


1

Ho risolto il problema aggiornando la Requestclasse ricevuta dal mio controller.

Ho rimosso la seguente annotazione a livello di classe dalla mia Requestclasse sul lato server. Dopo di che il mio cliente non ha ricevuto l'errore 415.

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

1

Il codice di stato 415 (Tipo di supporto non supportato) indica che il server di origine si rifiuta di soddisfare la richiesta perché il payload è in un formato non supportato da questo metodo sulla risorsa di destinazione. Il problema di formato potrebbe essere dovuto al Content-Type o Content-Encoding indicato nella richiesta o al risultato dell'ispezione diretta dei dati. DOC


0

Stavo inviando una richiesta di "cancellazione" e non è riuscita con 415. Ho visto quale tipo di contenuto utilizza il mio server per raggiungere l'API. Nel mio caso, era "application / json" invece di "application / json; charset = utf8".

Quindi chiedi al tuo sviluppatore API E nel frattempo prova a inviare la richiesta solo con content-type = "application / json".


0

Ho avuto lo stesso problema. Il mio problema era un oggetto complicato per la serializzazione. Un attributo del mio oggetto era Map<Object1, List<Object2>>. Ho cambiato questo attributo come List<Object3>dove Object3contiene Object1e Object2e tutto funziona correttamente.


0

So che è troppo tardi per aiutare l'OP con il suo problema, ma a tutti noi che sta riscontrando questo problema, avevo risolto questo problema rimuovendo il costruttore con i parametri della mia classe che doveva contenere i dati json.


0

Aggiungere MappingJackson2HttpMessageConverter manualmente nella configurazione ha risolto il problema per me:

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

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

0

Il motivo potrebbe non essere l'aggiunta di "annotation-driven" nel file xml del servlet del dispatcher. e potrebbe anche essere dovuto alla mancata aggiunta come application / json nelle intestazioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.