2012-03-14 51 views
1

我想做一個POST到REST服務。當使用標準的XMLHttpRequest方式時,它可以工作,但是當使用jQuery $ .ajax時,HTTPRequest頭部會變得混亂,POST變成OPTIONS。

我是新來的jQuery和HTTP,所以我可能會錯過一些東西明顯:)

這工作:

function sendPostXMLHTTP() { 
    var jData = { "Name": "Olle" }; 

    var client = new XMLHttpRequest(); 
    client.open("POST", "http://localhost:8383/DEMOService/TestPost"); 
    client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); 
    client.send(JSON.stringify(jData)); 
} 

這不起作用:

function sendPostAjax() { 
    var jData = { "Name": "Olle" }; 

    $.ajax({ 
     type: 'POST', 
     url: 'http://localhost:8383/DEMOService/TestPost', 
     contentType: "text/plain;charset=UTF-8", 
     data: JSON.stringify(jData) 
    }); 
} 

的HTTPRequest產生來自sendPostXMLHTTP()(正確):

POST http://localhost:8383/DEMOService/TestPost HTTP/1.1 
Host: localhost:8383 
Connection: keep-alive 
Content-Length: 15 
Origin: http://localhost:9990 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 
Content-Type: text/plain;charset=UTF-8 
Accept: */* 
Referer: http://localhost:9990/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

{"Name":"Olle"} 

的HTTPRequest從sendPostAjax()不正確產生:

OPTIONS http://localhost:8383/DEMOService/TestPost HTTP/1.1 
Host: localhost:8383 
Connection: keep-alive 
Access-Control-Request-Method: POST 
Origin: http://localhost:9990 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 
Access-Control-Request-Headers: Origin, X-Requested-With, Content-Type, Accept 
Accept: */* 
Referer: http://localhost:9990/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

爲什麼會出現 「jQuery的$就」 三通轉POST到一個選項,爲什麼請求主體dissapear?

//帕特里克

+2

您是否在同一頁(並因此來源)上運行兩組代碼? OPTIONS請求表明您正在啓動CORS的預檢檢查。 – Quentin 2012-03-14 10:11:54

+0

你使用的是什麼版本的jQuery?我記得我不得不關閉一些觸發預檢的非標準頭文件,就像@Quentin建議的那樣。不知道他們是否解決了這個問題,你需要讓溝通結束。我有一個開放的問題> [這裏](http://stackoverflow.com/questions/3290068/please-help-test-a-cors-issue-in-firefox-jquery-ajax-when-401)<聞起來同樣的 – mplungjan 2012-03-14 10:15:44

回答

0

的jQuery假設你正在做一個Cross-Origin Resource Sharing請求。通過W3C標準,任何CORS請求必須在空的OPTIONS請求之前,請求服務器允許隨後的有效負載請求。

您是否正在向服務器請求其他腳本託​​管的請求?

如果是,那麼jQuery的請求是正確的,並且XMLHttpRequest的不是 - 您應該自己實現OPTIONS預檢請求。

如果不是,那麼您應該考慮更改配置中的某些內容 - 例如,將腳本移動到您的REST服務駐留的同一網站。

或者,如評論所示,這可能是您正在使用的jQuery或瀏覽器中的錯誤。

+0

您是否正在向服務器請求其他腳本託​​管的請求? - **對,我是。我想我必須在託管JavaScript的網絡服務器上添加,然後像你說的那樣發送根據W3C標準的OPTIONS預檢。謝謝你的幫助 :) – uggeh 2012-03-15 14:12:43

0

嘗試:

var jData = {name:'Olle'}; 
    $.ajax({ 
    url : 'http://localhost:8383/DEMOService/TestPost', 
    type : 'POST', 
    data : jData 
}); 

的數據將始終使用UTF-8字符集被髮送到所述服務器;你必須在服務器端正確解碼。 另請參見API