我有一个奇怪的问题,也许有人有洞察力。我使用以下代码将查询字符串编码为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
这只发生在几个字符(如括号)上。其他字符始终保持编码状态。有没有人想过我可能做错了什么?任何反馈都表示赞赏。
答案 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", "'");
如果有人有更好的解决方案,我相信我(和其他人)会感兴趣!