2015-06-20 109 views
0

我看到,與$.ajax()我可以使用dataType屬性來告訴jQuery什麼樣的響應我期望從服務器,通常是json確定HTTP請求的數據類型

但是在服務器端,我如何知道請求的數據類型?

我知道服務器通常應該根據請求的內容知道要發送什麼,但我的用例在這裏有點不同。我有一個內置在PHP中的錯誤處理程序,我想知道以哪種格式輸出調試信息。如果出現致命/語法錯誤,警告,腳本甚至可能無法到達與請求關聯的請求處理函數。

有一個CONTENT_TYPE標題,但顯然它總是application/x-www-form-urlencoded,它只發送POST請求。

還有一個HTTP_ACCEPT標題看起來像application/json, text/javascript, */*; q=0.01。我需要解析這個字符串嗎?

+1

有一個單獨的查詢參數可能是一個更好的主意,它指示您應該發送什麼類型的響應。我認爲你不應該依賴'HTTP_ACCEPT'被正確設置,並且有人可能會要求例如純文本,但後來想解析爲JSON。 – Xymostech

回答

1

客戶端沒有標準的方式來告訴服務器需要什麼樣的數據類型。客戶不告訴「我想要文本/純文本」或「只有HTML請」(這隻能從假設從URI)。他們只告訴他們可以解釋的內容(HTTP_ACCEPT)以及他們發佈的內容(CONTENT_TYPE)。

對於服務器端錯誤處理程序,以可靠地確定要使用的輸出格式,你可以通過額外的請求頭或查詢參數符合你的要求,例如:

$.ajax({ 
    ... 
    headers: { 
     "X-Expected-Format": "text/plain" 
    } 
    ... 
}); 
+0

['Accept'](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)請求頭部就是這麼做的。如果這隻包含「text/plain」,那麼客戶端_is_告訴服務器需要哪種數據類型。如果服務器無法返回該數據類型,則應該使用「HTTP 406」進行響應。 – SilverlightFox

0

沒有爲沒有標準約定Ajax客戶端在響應中告訴服務器它想要的數據格式。

對於特定的Ajax請求,通常有幾件事情是真實的。

  1. 該請求被稱爲生成特定類型的響應(例如,僅此響應並始終生成JSON)。客戶端不請求特定類型的數據。它只知道這個特定的請求只返回JSON。

  2. 該請求有一個與它一起發送的特定參數,用於請求特定類型的返回數據(例如XML,HTML,JSON等)。這可能是一個查詢參數(如果它是一個GET請求)。

  3. Ajax調用的路徑決定請求的響應類型。例如,我已經看到一個API,它使用請求中的一個路徑段來確定響應是XML還是JSON。

儘管選項2可以使用自定義HTTP標頭完成,但通常不會使用HTTP標頭完成。如果發送任何參數,它通常作爲ajax調用參數的一部分發送(但是會發送它們)。


dataType選項jQuery提供是需要告訴jQuery庫應該期待什麼類型的響應,這樣,如果是JSON,例如,它可以解析JSON你。這個參數通常不是必需的,因爲jQuery通常可以根據HTTP標頭或基於響應本身的樣本來判斷它的響應類型。在爲Ajax請求指定dataType當然沒有任何傷害,但它絕對必須與服務器返回的數據類型相匹配,並且您設置的dataType值不會以任何方式發送到服務器。這純粹是對客戶端庫的指示,說明它在到達時應如何處理響應。