包含空格的 HttpPost 请求失败

HttpPost request including spaces fails

使用 HttpPost 请求时,我使用 UTF-8 进行正确编码。当我在其中一个参数中使用 space 时,仍然出现以下错误:

原因:org.apache.http.ProtocolException:无效的重定向 URI:/seek/nearest.aspx?key=Miami vice&ex=0&cFilter=9a79e6ce-3344-409c-bbe9-496530baf758&children=n

URL中的无效字符是"Miami"和"vice"之间的space。

嗯,我以为 POST 请求没有放在 URL 字符串中。

这些是我构建 HttpPost 请求所采取的步骤。在 "mKeyword" 中是带有 "Miami vice" 的字符串。

1 - 将请求放入 NameValue 列表中:

List<NameValuePair> kwNvP = new ArrayList<NameValuePair>();
kwNvP.add(new BasicNameValuePair("ctl00$ContentBody$LocationPanel1$OriginText", mKeyword));

2 - 构建 URI

String search_url = "http://www.example.com/seek/nearest.aspx"; 
try {
    theUri = new URI( search_url);
} catch ( URISyntaxException e) { etc. 

3 - 构建 post 请求

HttpPost method = new HttpPost( theUri);
method.addHeader("User-Agent", "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0) Firefox/7.0");
method.addHeader("Pragma", "no-cache");
method.addHeader("Content-Type", "application/x-www-form-urlencoded");
method.addHeader("Accept-Language", "en");

4 - 构建内容实体

HttpEntity entity = null; 
try {
    entity = new UrlEncodedFormEntity( kwNvP, HTTP.UTF_8);
}
catch ( UnsupportedEncodingException e) { etc

5 - 执行请求

method.setEntity( entity);
HttpResponse res2 = null;
try {
    Thread.sleep( (int) (1000 * GeoTools.random( 0.1, 0.3))); 
    res2 = client2.execute(method);
    Log.v( WaypointActivity.TAG, "Status line = " + String.valueOf(res2.getStatusLine()));
} catch (Exception e) { 
    // --> Coming here ... see the exception trace

你能帮我解决这个问题吗?

没有看到完整的程序或真正的目标 URL 我不是 100% 确定...但这部分错误很明显:

Invalid redirect URI

这意味着您的原始 POST 请求返回的不是 200,而是 301,并且处理重定向的任何服务器都在创建格式错误的 URL,而不是您的代码。