对包含JSONArray的URL进行编码

时间:2010-09-25 01:57:21

标签: java android json url

我有一个Android应用程序,我试图使用HTTPGet将一些数据传递给Web服务。如果我只是使用JSONArray.toString()方法构造字符串,我最终得到的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中的空格和引号,这不起作用。如果我擅自做以下事情:

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

显然,这不是我正在寻找的,并且必须有一个更好的解决方案,而不是搜索/替换该网址的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]

1 个答案:

答案 0 :(得分:6)

您需要URL 查询参数 value ;例如

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数据的一个优点是,您可以发送的参数大小通常没有限制。