2012-05-24 26 views
0

我有一些麻煩,使得Jersey和Jquery以JSON格式傳遞數據。 在下面的最小示例中,始終將HTTP 204返回給調用JQuery客戶端。Jersey/Jquery HTTP通信和JSON數據

@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"); 
    } 
    }); 

在螢火蟲我見上文描述的設置下面的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一個設置:「應用程序/ JSON;字符集= 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。

Log(「success」);在服務器端永遠不會執行。

有人能指出我正確的方向嗎?

+0

順便說一句:Apache HttpClient測試可以發佈並從服務器接收json而沒有問題 – Hansi

+0

這也是我的問題。我花了幾個小時嘗試每一個可用的建議,但我無法讓它工作。看起來,.ajax無法將其數據轉換爲JSON對象,正如Jersey預期的那樣。 – Abbas

回答

0

dataType參數指的是從服務器返回的數據,而不是正在提交的數據。我認爲你假設它發送的是原始json,實際上它正在評估你傳遞的數據並使用jQuery.param()將其轉換爲字符串。這些數據將在$_REQUEST上提供給你。見documentation here

每文檔,你發送的數據應該是一個key-value字符串格式爲:

key1=value1&key2=value2 
使用此格式

或地圖:

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

也許你額外的引號將地圖關閉?我個人總是使用鍵值字符串,因爲它似乎有較少的怪癖。

+0

謝謝! 其實我想讓服務器返回JSON。 我按照下面的教程,他們也發送一個普通的json字符串作爲數據,而不是鍵/值字符串或地圖格式。 http://www.oracle.com/technetwork/articles/java/jersey-jquery-177519.html – Hansi