2013-10-02 14 views
0

如果POST數據在請求的主體中發送,爲什麼使用URL編碼?爲什麼POST請求經常與Content-type集一起發送到urlencoded?

POST請求需要的contentType被設置來描述請求的主體中發送的數據和URL編碼常用。

GET請求不會因爲沒有主體。請求參數位於URL中。

下面是代碼中的外觀(工作正常)。

/******************************************************************************/ 
// AJAX 

    $P.ajax = function (config_ajax) { 
     var xhr; 

     // get 

     if (config_ajax.type === 'get') { 
      xhr = new win.XMLHttpRequest(); 
      xhr.open('GET', config_ajax.url, true); 
      xhr.onload = function() { 
       if (this.status === 200) { 
        config_ajax.callback(xhr.responseText); 
       } 
      }; 
      xhr.send(null); 
     } 

     // post 

     if (config_ajax.type === 'post') { 
      xhr = new win.XMLHttpRequest(); 
      xhr.open("POST", config_ajax.url, true); 
      xhr.setRequestHeader("Content-type", 
        "application/x-www-form-urlencoded"); 
      xhr.onload = function() { 
       if (this.status === 200) { 
        config_ajax.callback(xhr.responseText); 
       } 
      }; 
      xhr.send(config_ajax.data); 
     } 

在這裏,您可以看到發送數據GET爲空並填充爲POST發送數據,也將POST數據是URL編碼()和GET數據是沒有的。

URL編碼不是默認的,如果你不指定它或其他一些編碼,錯誤將被拋出。

我想,我要問,這就是爲什麼我不能離開其關閉(將contentType爲POST),並具有數據傳輸?

或者如果通過規範需要Content-type。有什麼我比URL編碼更好用嗎?

如上所述,因爲數據是不是在URL中,也不需要URL編碼,我寧願使用一些更簡單。

我的猜測是,這是不可能的,這只是一個默認的,已經在Ajax之前使用,也許當POST請求確實使用URL?

回答

0

如果POST數據在請求正文中發送,爲什麼使用URL編碼?

你必須使用某種編碼。

大多數來自瀏覽器的POST請求都在提交表單數據。

在GET請求中發送的表單數據使用URL編碼。

使用相同的編碼方式意味着您可以使用相同的序列化器和解析器。

我想,我問的是,爲什麼我不能離開它(POST的contentType),並有數據傳輸?

因爲你會發送一些數據而不告訴接收者它應該如何解碼。

或者,如果通過說明書內容類型是必需的。有什麼我比URL編碼更好用嗎?

您可以使用任何你喜歡的編碼。網址編碼方便,適用於大多數數據。

我更願意用一些更簡單的

URL編碼是非常簡單,和JavaScript可以很容易地生成感謝encodeURIComponent

+0

你錯過了我的問題的全部。編碼似乎更多是逃避。 'encodeURIComponent'可能更好,叫做'escapeURIComponent'。沒有必要轉義未放置在URI中的字符。所以據我所知,您不需要轉義POST請求正文中的任何字符。在理想的世界中,你不會強迫對不需要它的東西進行「編碼」。我不想發送編碼或轉義的數據。我可以使用什麼來發送純文本數據或純二進制數據?不過,我會將此標記爲將其從我未標記的列表中刪除。 –

+1

URI格式不使用轉義字符,它使用百分號編碼,因此建議函數被稱爲「escapeURIComponent」是沒有意義的。 – Quentin

+0

'application/x-www-form-urlencoded'格式表示一系列鍵/值對。如果不對特殊含義的字符進行編碼,則無法將這些字符作爲數據和這些字符作爲特殊含義區分。這將導致無法在數據中使用(例如)和&符號(因爲它將鍵/值對分開)。 – Quentin