0

我正在尝试访问特定的 url

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(new AuthScope("abc.com", 443),
                new UsernamePasswordCredentials("user", "Passwd"));

HTTPHelper http = new HTTPHelper(httpclient);

http.get("http://abc.com/**aaa**/w/api.php?param=timestamp%7Cuser&format=xml");

其中 %7C= |

这在内部将我重定向到以下网址

http://abc.com/**bbb**/w/api.php?param=timestamp%257Cuser&format=xml

正因为如此,我无法获得正确的输出......

| ==>%7C

%==> %25

%7C == %257C

我想要查询,timestamp|user 但是由于循环重定向,它变成了timestamp%7Cuser 有什么办法可以避免这种情况吗?

我也写了自己的自定义重定向策略

httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {
            public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) {
                boolean isRedirect = false;
                try {
                    isRedirect = super.isRedirected(request, response, context);
                    LOG.info(response.getStatusLine().getStatusCode());
                    LOG.info(request.getRequestLine().getUri().replaceAll("%25", "%"));
                } catch (ProtocolException e) {
                    e.printStackTrace();
                }
                if (!isRedirect) {
                    int responseCode = response.getStatusLine().getStatusCode();
                    if (responseCode == 301 || responseCode == 302) {
                        return true;
                    }
                }
                return isRedirect;
            }
        });

但我不确定如何从重定向的 url 用 %7C 替换 %25C

4

2 回答 2

1

看起来网站的 URL 重写规则只是被破坏了。如果它不是您的站点,您可能需要联系其维护人员并告知他们该问题。

同时,您是否有某些原因不能简单地直接使用目标 URL(即http://abc.com/**bbb**/w/api.php?...),避免重定向?

于 2012-09-22T13:05:14.590 回答
0

只是http.get("http://abc.com/**aaa**/w/api.php?param=timestamp|user&format=xml"); 工作吗?

“在内部将我重定向到以下网址”是什么意思?就像您的网址被再次编码一样。您可以在 HTTPHelper 中发布代码吗?我下面的测试代码工作正常。

客户代码:

HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://localhost:8080/test/myservlet?param=timestamp%7Cuser&format=xml");
client.execute(get);

小服务程序代码:

protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        String param = request.getParameter("param"); //get timestamp|user
        String format = request.getParameter("format");

    }
于 2012-09-21T07:41:51.973 回答