Ik bel een REST-service met een JSON-verzoek en deze reageert met een HTTP 415 "Unsupported Media Type"
-fout.
Het inhoudstype van het verzoek is ingesteld op ("Content-Type", "application/json; charset=utf8")
.
Het werkt prima als ik geen JSON-object in de aanvraag opneem. Ik gebruik de bibliotheek google-gson-2.2.4
voor JSON.
Ik heb geprobeerd een aantal verschillende bibliotheken te gebruiken, maar het maakte geen verschil.
Kan iemand me alsjeblieft helpen dit op te lossen?
Hier is mijn code:
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 waarde van requestJson.toString()
is :
{"type":"arl","action":"remove","domain":"staging","objects":"http://www.example.com"}
Antwoord 1, autoriteit 100%
Niet zeker over de reden, maar het verwijderen van regels charset=utf8
uit con.setRequestProperty("Content-Type", "application/json; charset=utf8")
opgelost het probleem.
Antwoord 2, autoriteit 83%
Voeg Content-Type
toe: application/json
en Accept
: application/json
Antwoord 3, autoriteit 17%
Als je een jQuery ajax-verzoek doet, vergeet dan niet om
. toe te voegen
contentType:'application/json'
Antwoord 4, autoriteit 15%
Dit komt omdat charset=utf8
zonder spatie moet staan na application/json
. Dat zal prima werken. Gebruik het zoals application/json;charset=utf-8
Antwoord 5, autoriteit 4%
Als u AJAX
jQuery
Request gebruikt, is dit een must om toe te passen. Zo niet, dan krijg je een 415
-foutmelding.
dataType: "json",
contentType:'application/json'
Antwoord 6, autoriteit 4%
Als je dit krijgt in React RSAA-middleware of iets dergelijks,
Voeg de koppen toe:
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(model),
Antwoord 7, Autoriteit 3%
HTTPVERB heeft zijn kopteksten nodig als een woordenboek van sleutelwaardeparen
headers = {'Content-Type': 'application/json', 'charset': 'utf-8'}
Antwoord 8, Autoriteit 2%
Voeg de HTTP Header-manager toe en voeg er in de namen en waarden van uw API-namen toe.
b.v. Inhoudstype, accepteren, enz. Die uw probleem oplost.
Antwoord 9
Soms breekt Charset Metada de JSE tijdens het verzenden van het verzoek. Beter, gebruik geen CharsSet = UTF8 in het aanvraagtype.
Antwoord 10
Ik heb dit opgelost door de Request
CLEDE te bijwerken die mijn controller ontvangt.
I Verwijderd De volgende klassive-annotatie van mijn Request
Klasse aan mijn serverzijde. Daarna ontving mijn klant geen 415 fout.
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
Antwoord 11
De statuscode van 415 (niet-ondersteunde mediatype) geeft aan dat de
Origin Server weigert het verzoek te onderhouden omdat de lading
is in een formaat dat niet door deze methode op de doelbron wordt ondersteund.
Het formaatprobleem kan te wijten zijn aan het aangegeven verzoek
Inhoudstype of inhoudscodering, of als gevolg van het inspecteren van de
gegevens rechtstreeks.
DOC
Antwoord 12
Ik stuurde een “verwijder” restverzoek en het mislukte met 415. Ik zag welk inhoudstype mijn server gebruikt om de api te bereiken. In mijn geval was het “application/json” in plaats van “application/json; charset=utf8”.
Vraag het dus aan uw api-ontwikkelaar en probeer in de tussentijd alleen een verzoek te verzenden met content-type= “application/json”.
Antwoord 13
Ik had hetzelfde probleem. Mijn probleem was een ingewikkeld object voor serialisatie. Een kenmerk van mijn object was Map<Object1, List<Object2>>
.
Ik heb dit kenmerk gewijzigd zoals List<Object3>
waarbij Object3
Object1
en Object2
bevat en alles goed werkt.
Antwoord 14
Ik weet dat dit veel te laat is om de OP te helpen met zijn probleem, maar voor ons allemaal die dit probleem net tegenkomen,
Ik had dit probleem opgelost door de constructor met parameters van mijn klasse te verwijderen die bedoeld waren om de json-gegevens te bevatten.
Antwoord 15
MappingJackson2HttpMessageConverter handmatig toevoegen in de configuratie loste het probleem voor mij op :
@EnableWebMvc
@Configuration
@ComponentScan
public class RestConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
messageConverters.add(new MappingJackson2HttpMessageConverter());
super.configureMessageConverters(messageConverters);
}
}
Antwoord 16
De reden kan zijn dat u niet “annotatiegestuurd” toevoegt aan uw xml-bestand van de dispatcherservlet. en het kan ook te wijten zijn aan het niet toevoegen als application/json in de headers
Antwoord 17
Ik heb dit probleem ook ondervonden bij het werken met de REST-service met een JSON-verzoek en het reageert met een HTTP 415 “Niet-ondersteund mediatype”-fout.
Deze coderegels helpen u het probleem op te lossen.
headers: { “Content-Type”: “application/json”, “accept”: “/” },
Daarna moet u code schrijven om de JSON-body te coderen.
Bijvoorbeeld,
body: jsonEncode({“gebruikersnaam”: gebruikersnaam, “wachtwoord”: wachtwoord})
Antwoord 18
Als je een postverzoek doet via Postman
, zorg er dan voor dat je deze 2 opties hebt gekozen
2. Inhoudstype– applicatie/json