我有一个网址列表,我需要获取其中的内容。 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。
针对此问题的任何其他解决方案?
感谢。
答案 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”
我希望这有帮助