2010-09-25 64 views
2

我有一個android應用程序,我試圖用它將一些數據傳遞給使用HTTPGet的webservice。如果我只是用JSONArray.toString()方法構造的字符串,我結束了,看起來像一個網址如下:編碼一個包含JSONArray的URL

http://xxx.xx.xxx.xx/api?method=upload&args[deviceID]=123456789&args[data]=["{element1=93295352, element2=235235, element3=3523523}","{element1=93295352, element2=235235, element3=3523523}"] 

這不,因爲在URL中的空格和引號的工作。如果我attampt做類似如下:

JSONArray ja = new JSONArray(); 

// Add Data to JSONArray 

String s = ja.toString(); 

// Add array to StringBuilder url 

HTTPGet httpget = new HTTPGet(UrlEncoder.encode(url.toString())); 

我得到拋出,因爲整個URL編碼得到一個錯誤,像這樣結束:

http%3A%2F%2Fxxx.xx.xxx.xx%2Fapi%3Fmethod%3Dupload%26args%5BdeviceID%5D%3D123456879%26args%5Bdata%5D%3D%5B%22%7Belement1%3D915156028000%2C+element2%3D1651651%2C+element3%3D489461%7D%22%2C%22 

很顯然,這不是我m尋找,並有一個更好的解決方案比搜索/替換該網址的JSONArray部分中的所有必要的字符,但我想這樣做不會是一個巨大的麻煩,因爲我只是擔心報價和空間字符。

需要注意的是手工粘貼到瀏覽器這個返回的結果我想到:

http://xxx.xx.xxx.xx/api?method=upload&args[deviceID]=123456789&args[data]=[%22{element1=915156028000,%20element2=0.0,%20element3=2.297444}%22,%22{element1=915156055000,%20element2=0.0,%20element3=2.2974419999999998}%22] 

回答

5

你需要URL編碼只是查詢參數;例如

JSONArray ja = new JSONArray(); 

// Add Data to JSONArray 

String s = UrlEncoder.encode(ja.toString()); 

// Add string to StringBuilder url 

HTTPGet httpget = new HTTPGet(url.toString()); 

您需要注意的另一件事是,URL的長度有實際限制。這些限制因實現而異(瀏覽器,服務器,代理,HTTP客戶端庫等)。在某些情況下,它低至2k字節,IIRC。

跟進

如果我想用POST而不是做同樣的事情,我最終不得不以同樣的方式對數據編碼?

這取決於。

  • 如果您使用POST將參數作爲URL查詢參數發送,則將應用相同的編碼規則和限制。爲了記錄,URL編碼規則是URLURI規範的一部分。
  • 如果您使用「application/x-www-form-urlencoded」內容類型將參數作爲POST數據發送,則編碼規則有點不同;請參閱HTML spec。 (主要區別在於此編碼將空格編碼爲+字符。)
  • 如果HTTP客戶端和服務器都瞭解編碼和內容類型,那麼也可以用某種其他方式編碼POST數據。

當然,使用POST數據的優點之一是通常可以發送參數的大小沒有限制。

+0

謝謝。是的,我碰到了極限。如果我想使用POST來做同樣的事情,那麼最終是否必須以相同的方式對數據進行編碼? – wtollett 2010-09-25 03:14:02

相關問題