Java 对包含JSONArray的URL进行编码

Java 对包含JSONArray的URL进行编码,java,android,json,url,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=9

我有一个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}"]
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://xxx.xx.xxx.xx/api?method=upload&args[deviceID]=123456789&args[data]=["{element1=93295352, element2=235235, element3=3523523}","{element1=93295352, element2=235235, element3=3523523}"]
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
显然,这不是我要寻找的,肯定有比搜索/替换该url的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]
您需要仅对查询参数值进行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来做同样的事情,我是否必须以同样的方式对数据进行编码

视情况而定

  • 如果将参数作为URL查询参数与POST一起发送,则将应用相同的编码规则和限制。对于记录,URL编码规则是和规范的一部分
  • 相反,如果您使用“application/x-www-form-urlencoded”内容类型将参数作为POST数据发送,则编码规则有点不同;看。(主要区别在于此编码将空格编码为
    +
    字符。)
  • 如果HTTP客户机和服务器都理解编码和内容类型,您还可以用其他方式对POST数据进行编码

当然,使用POST数据的优点之一是,您可以发送的参数的大小通常没有限制。

谢谢。是的,我跑进了极限。如果我想用POST来做同样的事情,我是否必须以同样的方式对数据进行编码?