0

Jersey と Jquery が JSON 形式でデータを通信するのに問題があります。次の最小限の例では、常に HTTP 204 が呼び出し元の JQuery クライアントに返されます。

@Path("/path")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class Resource {
    @POST
    public ReturnData postSomething(@Valid Data data) {
      Log("success");
      ...
      ReturnData returnData = ...;
      return returnData;
    }
}

次の JQuery コードを使用し、投稿ごとにエラー関数が呼び出されます。

$.ajax({
     type: "POST",
     contentType: "application/json; charset=utf-8",
     url: url,
     data: '{"data": "data"}',
     dataType: "json",
     error: function(data){
          alert("fail");
     },
     success: function(data){
          alert("success");
     }
     });

Firebug では、上記の設定で次の HTTP 要求/応答が表示されます。

OPTIONS /path HTTP/1.1
Host: 192.168.15.109:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 204 No Content
Date: Thu, 24 May 2012 16:10:57 GMT
Allow: OPTIONS,POST

最初は contentType: "application/json; charset=utf-8" なしでセットアップを試みましたが、JQuery の投稿では次のようになりました。

POST /path HTTP/1.1
Host: 192.168.15.109:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/test.html
Content-Length: 104
Origin: http://localhost
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 415 Unsupported Media Type
Date: Thu, 24 May 2012 16:08:55 GMT
Content-Type: text/plain;charset=UTF-8
Cache-Control: must-revalidate,no-cache,no-store
Content-Length: 72
Cache-Control: no-cache

クライアントとサーバーが、何らかの理由で両者が同意するデータ型を見つけることができないと考えています。contentType を JSON に設定するときに、accept ヘッダーに JSON が含まれていないのは奇妙です。

ログ(「成功」); サーバー側では決して実行されません。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

dataType パラメータは、送信されるデータではなく、サーバーから返されるデータを参照します。実際には、渡されたデータを評価し、jQuery.param() を使用して文字列に変換しているときに、生の json を送信していると想定していると思います$_REQUEST。こちらのドキュメントを参照してください

ドキュメントによると、送信するデータは次の形式のキーと値の文字列にする必要があります。

key1=value1&key2=value2

または、次の形式を使用したマップ:

{key1: 'value1', key2: 'value2'}

おそらく、あなたの余分な引用符がマップをオフにしていますか? 癖が少ないように見えるので、個人的には常にキーと値の文字列を使用します。

于 2012-05-24T16:37:21.017 に答える