某些字符的神秘URL解码 - Android URI / Google App Engine

时间:2012-07-26 00:22:27

标签: android google-app-engine url url-encoding urldecode

我有一个奇怪的问题,也许有人有洞察力。我使用以下代码将查询字符串编码为Android上的URL:

request = REQUEST_BASE + "?action=loadauthor&author=" + URLEncoder.encode(author, "UTF-8");

然后我在字符串中添加一些其他参数并创建一个这样的URI:

uri = new URI(request);

在某个时刻,我拉出查询字符串以进行校验和:

uri.getRawQuery().getBytes();

然后我发送它:

HttpGet get = new HttpGet(uri);

在Appengine服务器上,我然后检索字符串并尝试匹配校验和:

String query = req.getQueryString();

通常,这很好用。但是,有一些字符似乎在去往服务器的途中没有编码。例如,

行动= loadauthor&安培;作者=查尔斯+亚历山大+%28Ohiyesa%29 +伊士曼&安培;时间戳= 1343261225838&安培;用户= 1479845600

在服务器日志(和GAE应用程序)中显示为:

行动= loadauthor&安培;作者=查尔斯+亚历山大+(Ohiyesa)+伊士曼&安培;时间戳= 1343261226837&安培;用户= 1479845600

这只发生在几个字符(如括号)上。其他字符始终保持编码状态。有没有人想过我可能做错了什么?任何反馈都表示赞赏。

2 个答案:

答案 0 :(得分:0)

URLEncoder不对括号和某些其他字符进行编码,因为它们对于大多数服务器来说应该是“安全的”。见URLEncoder。如有必要,您必须自己更换。

示例:

URI uri = new URI(request.replace("(","%28"));

如果需要大量替换,可以尝试request.replaceAll(String regularExpression,String replacement)。当然,这需要了解正则表达式。

答案 1 :(得分:0)

我从来没有找到解决这个问题的方法。在将内容发送到服务器之前,我通过解除客户端上的某些字符来解决这个问题:

request = request.replace("%28", "(");
request = request.replace("%29", ")");
request = request.replace("%27", "'");

如果有人有更好的解决方案,我相信我(和其他人)会感兴趣!