6

残りのサービスへの単純なjquery ajax呼び出しを行っています。contentType を「application/json」に設定しており、残りのリソースは「MediaType.APPLICATION_JSON」を受け入れるように構成されています。これは POST メソッドです。このセットアップでは、「サポートされていないメディア タイプ」エラーが発生します。

ヘッダー情報は 、要求ヘッダーに「Content-Type application/json; charset=UTF-8」を示しています

応答の表示: ステータス レポート: サポートされていないメディア タイプ 要求エンティティが、要求されたメソッドの要求されたリソースでサポートされていない形式であるため (サポートされていないメディア タイプ)、サーバーはこの要求を拒否しました。

この問題を解決するための指針をいくつか提供してください。

コード スニペットは次のとおりです。

リソースの残り

@POST
@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML})
@Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML})
public Response addPerson(MyJSONObj myObj) {
    //...  
    // ...
    //...
}

jquery

$(document).ready(function() { /* put your stuff here */
    $("#Button_save").click(function(){
    var firstName = $('firstName').val(); 
    var lastName = $('lastName').val(); 
    var person = {firstName: firstName, lastName: lastName}; 
    $.ajax({

        url:'http://localhost:8080/sampleApplication/resources/personRestService/',
        type: 'POST',
        data: person,
        Accept : "application/json",
        contentType: "application/json",

        success:function(res){
        alert("it works!");
        },
        error:function(res){
            alert("Bad thing happend! " + res.statusText);
        }
    });
    });
}); 

FF Firebug に表示されるヘッダー

応答ヘッダー

Content-Length  1117
Content-Type    text/html;charset=utf-8
Date    Thu, 05 Apr 2012 09:44:45 GMT
Server  Apache-Coyote/1.1

リクエスト ヘッダー

Accept  */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection  keep-alive
Content-Length  97
Content-Type    application/json; charset=UTF-8
Host    localhost:8080
Referer http://localhost:8080/sampleApplication/
User-Agent  Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0
X-Requested-With    XMLHttpRequest
4

4 に答える 4

5

私は同じ問題を抱えていて、その方法で解決できました(http://www.weverwijk.net/wordpress/tag/jquery/を参照):

$.ajax({
    url:'http://localhost:8080/sampleApplication/resources/personRestService/',
    type:'POST',
    data: JSON.stringify(person),
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    success:function(res){
        alert("it works!");
    },
    error:function(res){
        alert("Bad thing happend! " + res.statusText);
    }
});

Java側では、これらを追加しました(Access-Control-Allow-Originを参照):

@OPTIONS
public Response testt(@Context HttpServletResponse serverResponse) {
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true");
    serverResponse.addHeader("Access-Control-Allow-Origin", "*");
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");
    serverResponse.addHeader("Access-Control-Max-Age", "60");
    return Response.ok().build();
}

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(APPLICATION_JSON)
public Response addPerson(MyJSONObj myObj, @Context HttpServletResponse serverResponse)
    serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    serverResponse.addHeader("Access-Control-Allow-Credentials", "true");
    serverResponse.addHeader("Access-Control-Allow-Origin", "*");
    serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");
    serverResponse.addHeader("Access-Control-Max-Age", "60");

    // ...
    // ...
} 

結論

  • JSON オブジェクトは自動的に転送および変換されます (詳細については、RESTful Web サービス用の JSON の構成を参照してください) 。
  • POST コミット
  • クロスドメイン (Same-Origin-Policy)
  • Firefox は動作します (@Option タグを参照)
于 2012-08-06T15:07:51.537 に答える
1

コードが次の 2 つの追加処理を行っていれば、元の投稿は機能していたと思います。

dataJSON.serialize(person)に設定し、dataType' json'に設定します。

于 2015-02-27T18:54:37.437 に答える
0

漏れやすい抽象化に苦しんでいるようです。次の応答を参照してください: JQuery の getJSON() が Accept ヘッダーを正しく設定していませんか?

クロスドメイン呼び出しを行っている場合、jQuery が呼び出しを抽象化する方法が原因で、accept ヘッダーを設定できないようです。

ただし、サーバーは正しい受け入れヘッダーを見ていると言っています。それは別の問題を示している可能性があります。

于 2012-04-10T01:19:38.473 に答える