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

相关问题