我目前正在尝试让HttpComponents发送HttpRequests并检索响应。 在大多数URL上,这没有问题,但是当我尝试获取phpBB论坛的URL http://www.forum.animenokami.com时,客户端需要更多时间,而responseEntity不止一次包含段落,导致html文件损坏。
例如,元标记包含六次。由于许多其他URL工作,我无法弄清楚我做错了什么。 页面在已知的浏览器中正常工作,因此它不是一个问题。
以下是我用来发送和接收的代码。
URI uri1 = new URI("http://www.forum.animenokami.com");
HttpGet get = new HttpGet(uri1);
get.setHeader(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0"));
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(get);
HttpEntity ent = response.getEntity();
InputStream is = ent.getContent();
BufferedInputStream bis = new BufferedInputStream(is);
byte[] tmp = new byte[2048];
int l;
String ret = "";
while ((l = bis.read(tmp)) != -1){
ret += new String(tmp);
}
我希望你能帮助我。 如果您需要更多信息,我会尽快提供。
答案 0 :(得分:4)
此代码完全破解:
String ret = "";
while ((l = bis.read(tmp)) != -1){
ret += new String(tmp);
}
三件事:
幸运的是,您可以使用EntityUtils
轻松避免所有这些:
String text = EntityUtils.toString(ent);
这将使用响应中指定的适当字符编码(如果有),否则使用ISO-8859-1。 (还有另一个重载,它允许您指定在未指定的情况下使用哪种字符编码。)
值得理解原始代码的错误,而不是只是用更好的代码替换它,这样你就不会在其他情况下犯同样的错误。
答案 1 :(得分:0)
它工作正常,但我不明白为什么我只在此网址上多次看到相同的文字。
这是因为您的客户端在读取套接字时看到更多不完整的缓冲区。可能是:
关键是您的客户端必须密切关注read
调用读入缓冲区的字节数,否则最终会插入垃圾邮件。特别是网络流不容易填充缓冲区。