2011-10-26 62 views
6

我很難搞清楚將POST參數編碼爲服務器調用的最佳方式。我正在編寫一個將由PHP服務器提供服務的C#客戶端。我想在參數中允許很大的靈活性,所以我現在的計劃是使用JSON編碼的單個參數。例如:如何編碼HTTP POST參數(C#客戶端到PHP服務器)?

params = {"object":"Main","function":"doecho","params":["echothis...."]} 

我使用的C#WebRequest對象和contentType中的 「application/X WWW的窗體-urlencoded;字符集= UTF-8」。數據到達服務器,一切都按預期工作,直到我在數據中添加非法JSON字符。

例如,如果我使用以下數據,那麼我無法在服務器端對其執行json_decode。服務器出現自動開機的40%投入一個雙引號(「),當我用$這個 - > Request()方法讀它 - > getParams()方法;(Zend_Framework)

params = {"object":"Main","function":"doecho","params":["echothis%25%5d%22%40%3d%26...."]} 

什麼是最好的在這裏練習嗎?我需要base64編碼數據嗎?是否有什麼明顯我缺少的內容類型或PHP設置?

我完全控制客戶端和服務器,所以我想知道什麼是正確/最好的事情

回答

8

雖然潛在的任何內容類型可用於上傳到HTTP,有在實踐中使用了三個:

  1. 一個具體由給定服務的文檔集。
  2. application/x-www-form-urlencoded - HTML表單使用的默認值。
  3. multipart/form-data - HTML表單使用的其他表單,它包含表單上傳時所需的表單。

由於2和3是如此常用(因爲它們受所有瀏覽器提交表單的支持),幾乎所有服務器端技術都有處理它們的東西。所以除非PHP部分有些奇怪,否則你應該可以使用。

application/x-www-form-urlencoded不適用於某些數據,但對於它的用途最爲簡單。它與爲GET表單請求創建查詢字符串的方式幾乎相同,但是與POST內容相同。

因此,你希望你的內容是:

"params=" + Uri.EscapeDataString(paramData) 

這樣的第一變:

params=%7B%22object%22%3A%22Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis....%22%5D%7D 

而第二個:

params=%7B%22object%22%3A%22Ccmes_Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis%2525%255d%2522%2540%253d%2526....%22%5D%7D 

這兩者PHP的內置插件的將回到你的問題的形式。

+0

是的,這對我有意義。謝謝! – Jeff

+0

由於nit-picking可以防止bug,請注意「params」(但不是「=」)也應該是URI編碼的。因爲我知道當URI編碼的「params」仍然是「params」時,我不是一個快捷方式,但如果它是「párams」或「params」,那麼它必須是。 –

1

我的第一個想法是編碼爲base64。我認爲這應該是簡單的方式。

arcanecode.com

static public string EncodeTo64(string toEncode) 
{ 
    byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
    string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); 
    return returnValue; 
} 
+0

如果第一個例子工作,那麼這不可能是正確的,因爲第一個例子不是Base-64。 –

+0

Jon Hanna,EncodeTo64函數(hichaeretaqua的答案)僅用於以ASCII字節的十六進制表示形式對字符串進行編碼。 –

相關問題