【发布时间】:2014-02-10 01:11:21
【问题描述】:
我想在我的 Android 设备上使用远程 API,但由于某种原因,UrlEncodedFormEntity 类不会像远程 API 预期的那样将 _ 转换为 %5f。因此,使用此代码:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(
new BasicNameValuePair("json",
"{\"params\":{\"player_name\":\"Toto\",
\"password\":\"clearPass\"},
\"class_name\":\"ApiMasterAuthentication\",
\"method_name\":\"login\"}")
);
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
ResponseHandler responseHandler = new BasicResponseHandler();
httpClient.execute(httpPost, responseHandler);
向服务器发送一个发布请求,内容如下:
json=%7B%22params%22%3A%7B%22player_name%22%3A%22Toto%22%2C%22password%22%3A%22clearPass%22%7D%2C%22class_name%22%3A%22ApiMasterAuthentication%22%2C%22method_name%22%3A%22login%22%7D
我希望它是这样的(将之前的下划线替换为 %5F):
json=%7B%22params%22%3A%7B%22player%5Fname%22%3A%22Toto%22%2C%22password%22%3A%22clearPass%22%7D%2C%22class%5Fname%22%3A%22ApiMasterAuthentication%22%2C%22method%5Fname%22%3A%22login%22%7D
我无法控制 API,API 的官方客户端行为是这样的。这似乎是 URL normalization 的预期行为
我错过了什么吗?我一开始以为是UTF-8编码问题,但是在UrlEncodedFormEntity的构造函数中添加HTTP.UTF-8并不能解决问题。
感谢您的帮助。
编辑:最后,问题不是来自这个不转义的下划线。即使我试图重现该行为的其他客户端逃脱了它,我也只需要设置正确的标题:
httpPost.addHeader("Content-Type","application/x-www-form-urlencoded");
请求工作得很好。感谢大家,尤其是 singh.jagmohan 的帮助(即使问题最终出在其他地方)!
【问题讨论】:
标签: java android http url apache-httpclient-4.x