JSONでのHTTP 415 Unsupported Media typeエラー


115

JSONリクエストでRESTサービスを呼び出していますが、HTTP 415 "Unsupported Media Type"エラーで応答します。

リクエストのコンテンツタイプはに設定され("Content-Type", "application/json; charset=utf8")ます。

リクエストにJSONオブジェクトを含めなくても問題なく動作します。google-gson-2.2.4JSON のライブラリを使用しています。

いくつかの異なるライブラリを使用してみましたが、違いはありませんでした。

誰かがこれを解決するのを手伝ってくれませんか?

これが私のコードです:

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;

}
}

の値requestJson.toString()は次のとおりです。

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


次の値で質問を更新してくださいrequestJson.toString()
Sabuj Hassan '21

1
requestJson.toStringの値は:{"type": "arl"、 "action": "remove"、 "domain": "staging"、 "objects": " abc.com "}
user3443794

サーバー部分を書きましたか?Postman(Chrome拡張機能、Google it)で同じリクエストを行う場合、それは機能しますか?おそらくサーバーは何らかの理由でJSONコンテンツタイプを受け入れませんか?
joscarsson 14年

はい、soapUIを使用してテストしました。私はjsonを含むまったく同じリクエストを送信し、サーバーから正常に応答しました。
user3443794 2014年

@ joscarsson、2017年3月14日以降、Postman chrome拡張機能は非推奨になりました。彼らはネイティブアプリに移動しました。ここに彼らのブログ投稿があります:http
セルジュ・キシコ

回答:


81

理由は不明ですが、行charset=utf8を 削除con.setRequestProperty("Content-Type", "application/json; charset=utf8")すると問題が解決しました。


おそらくReSTサービスのバグです。それらはおそらくcharsetContent-Typeで設定されることを期待されていません。私の推測では、文字列かどうかをチェックしています"application/json; charset=utf-8" == "application/json"。そうは言っても、JSONはutf-8でなければならないので、文字セットを省略することは完全に有効です。
Tim Martin

19
そのためcharset=utf8、有効な文字セットの指定ではありません。正しいバージョンはになりますcharset=utf-8。ダッシュは重要です。有効な文字セットの指定のリストは、IANA RFC2879によって管理されていますiana.org/assignments/character-sets/character-sets.xhtml
Berin Loritschを

さまざまなことを試すのに多くの時間を無駄にし、charset = utf8を削除してみましたが、うまくいきました。ありがとう。
Salman


13

これは、charset=utf8後にスペースがない必要があるためapplication/jsonです。それはうまくいきます。好きに使うapplication/json;charset=utf-8


これは誤りです。スペースは許可されており、無視する必要があります。tools.ietf.org/html/rfc2046を参照してください。
djb 2018年

11

jquery ajaxリクエストを行う場合は、追加することを忘れないでください

contentType:'application/json'

4

AJAX jQueryリクエストを使用している場合、これは適用する必要があります。そうでない場合は、415エラーがスローされます。

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

2

HTTPヘッダーマネージャーを追加し、その中にAPIのヘッダー名と値を追加します。例:Content-type、Acceptなど。これで問題が解決します。


2

これをReact RSAAミドルウェアなどで取得した場合は、ヘッダーを追加します。

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

1

Charset Metadaがリクエストを送信しているときにjsonを壊すことがあります。リクエストタイプでcharset = utf8を使用しないでください。


2
utf8は有効な文字セットではありません。仕様をご覧
Berin Loritsch

1

Requestは、コントローラーが受け取るクラスを更新してこれを修正しました。

サーバー側のクラスから次のクラスレベルの注釈を削除しましRequest。その後、クライアントは415エラーを受け取りませんでした。

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

1

415(サポートされていないメディアタイプ)ステータスコードは、ペイロードがターゲットリソースのこのメソッドでサポートされていない形式であるため、配信元サーバーがリクエストへのサービスを拒否していることを示します。フォーマットの問題は、リクエストに示されたContent-TypeまたはContent-Encodingが原因であるか、データを直接検査した結果である可能性があります。 DOC


0

「削除」の残りのリクエストを送信していたところ、415で失敗しました。サーバーがAPIにアクセスするために使用するコンテンツタイプを確認しました。私の場合、「application / json; charset = utf8」ではなく「application / json」でした。

ですから、API開発者に尋ねてください。その間、content-type = "application / json"のみでリクエストを送信してみてください。


0

同じ問題がありました。私の問題はシリアル化のための複雑なオブジェクトでした。私のオブジェクトの1つの属性はでしたMap<Object1, List<Object2>>。私のようなこの属性変更List<Object3>どこObject3含まObject1としObject2、すべてが正常に動作します。


0

これがOPの問題を解決するには遅すぎることはわかっていますが、この問題が発生したばかりの私たち全員にとって、jsonデータを保持することを目的としたクラスのパラメーターを持つコンストラクターを削除することで、この問題を解決しました。


0

MappingJackson2HttpMessageConverterを手動で構成に追加すると、問題が解決しました:

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

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

0

理由は、ディスパッチャサーブレットのxmlファイルに「注釈駆動型」を追加していないためです。また、ヘッダーにapplication / jsonとして追加しないことが原因である可能性もあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.