如果url包含保留字符,则为Url重定向错误

时间:2012-09-20 15:10:52

标签: http url redirect httpclient mediawiki

我正在尝试访问特定网址

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;
            }
        });

但我不知道如何用重定向的网址

替换%25C%2C

2 个答案:

答案 0 :(得分:1)

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

与此同时,您是否有理由不直接使用目标网址(即http://abc.com/**bbb**/w/api.php?...),避免重定向?

答案 1 :(得分: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);

Servlet代码:

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

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

    }