使用httpclient进行URL编码

时间:2012-07-26 10:08:43

标签: java encoding apache-httpclient-4.x

我有一个网址列表,我需要获取其中的内容。 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列表,而不是我可以手动处理的URL。

针对此问题的任何其他解决方案?

感谢。

4 个答案:

答案 0 :(得分:4)

如果您使用URL urlObject = new URL(url)之类的字符串创建新的URL对象,然后执行urlObject.getQuery()urlObject.getPath()将其拆分,将查询参数解析为列表或地图,做某事并做类似的事情:

编辑:我刚刚发现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();
    // ...
}

答案 1 :(得分:0)

尝试

GetMethod get = new GetMethod(url.replace(" ","%20")).toASCIIString());

答案 2 :(得分:0)

如果需要使用请求URI进行操作,强烈建议使用Apache HttpClient随附的URIBuilder

答案 3 :(得分:-1)

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

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