9

我有一个需要获取其内容的 URL 列表。URL 带有特殊字符,因此需要进行编码。我使用 Commons HtpClient 来获取内容。

当我使用:

GetMethod get = new GetMethod(url);

我得到一个“无效的”非法转义字符“异常。当我使用

 GetMethod get = new GetMethod();
 get.setURI(new URI(url.toString(), false, "UTF-8"));

尝试获取页面时出现 404,因为转到了一个空格%2520而不是%20.

我看过很多关于这个问题的帖子,其中大多数建议部分地构建 URI。问题是它是一个给定的 URL 列表,而不是我可以手动处理的。

这个问题还有其他解决方案吗?

谢谢。

4

4 回答 4

5

如果您从它的字符串中创建一个新的 URL 对象,例如URL urlObject = new URL(url),然后正确拆分它urlObject.getQuery()urlObject.getPath()将查询参数解析为 List 或 Map 或其他东西,然后执行以下操作:

编辑:我刚刚发现 HttpClient Library 有一个URLEncodedUtils.parse()方法,您可以使用下面提供的代码轻松使用它。我将对其进行编辑以适应,但未经测试。

使用 Apache HttpClient 会是这样的:

URI urlObject = new URI(url,"UTF-8");
HttpClient httpclient = new DefaultHttpClient();
List<NameValuePair> formparams = URLEncodedUtils.parse(urlObject,"UTF-8");
UrlEncodedFormEntity entity;
entity = new UrlEncodedFormEntity(formparams);

HttpPost httppost = new HttpPost(urlObject.getPath());
httppost.setEntity(entity);
httppost.addHeader("Content-Type","application/x-www-form-urlencoded");

HttpResponse response = httpclient.execute(httppost);

HttpEntity entity2 = response.getEntity();

使用 Java URLConnection 会是这样的:

    // Iterate over query params from urlObject.getQuery() like
while(en.hasMoreElements()){
    String paramName  = (String)en.nextElement(); // Iterator over yourListOfKeys
    String paramValue = yourMapOfValues.get(paramName); // replace yourMapOfNameValues
    str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue);
}
try{
    URL u = new URL(urlObject.getPath()); //here's the url path from your urlObject
    URLConnection uc = u.openConnection();
    uc.setDoOutput(true);
    uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    PrintWriter pw = new PrintWriter(uc.getOutputStream());
    pw.println(str);
    pw.close();

    BufferedReader in = new BufferedReader(new 
            InputStreamReader(uc.getInputStream()));
    String res = in.readLine();
    in.close();
    // ...
}
于 2012-07-26T10:37:17.403 回答
1

如果您需要使用请求 URI 进行操作,强烈建议使用URIBuilderApache HttpClient 附带的。

于 2019-12-12T14:00:57.263 回答
0

试试看

GetMethod get = new GetMethod(url.replace(" ","%20")).toASCIIString());
于 2019-12-12T12:57:23.550 回答
-1

请使用URLEncoder类。
我在一个确切的场景中使用它,它对我来说效果很好。
我所做的是使用 URL 类来获取主机之后的部分
(例如 - 在 www.bla.com/mystuff/bla.jpg 这将是“mystuff/bla.jpg” - 你应该只使用 URLEncode这部分,然后再构造URL。

例如,如果原始字符串是“http://www.bla.com/mystuff/bla foo.jpg”那么:
编码-“mystuff/bla foo.jpg”得到“mystuff/bla%20foo.jpg”,然后将其附加到主机和协议部分:
“http://www.bla.com/mystuff/bla%20foo.jpg”
我希望这会有所帮助

于 2012-07-26T10:12:57.240 回答