当使用jsoup访问http的接口时,但如果遇到不能完整获取响应内容时,一般有以下几个原因。
1. 网络异常,造成读取不全。这个很少发生,因为jsoup会报告exception
2. 网络超时,此时可以设置 connection.timeout(n) 增加超时时间。
3. 一切看起来都正常,也没有异常发生。 但是获取的数据就是少了一截。
这里主要将第三点。
仔细分析获取到的数据,发现得到数据都是1024k。
如果获取到的数据不超过1024k,程序正常,得到的数据也正常。
一旦数据超过1024k时,数据就只有预期得到数据的前1024k字节了。
仔细查找jsoup的api 发现,默认设置下,jsoup最大获取的响应长度正好时1M。
所以这个时候只要设置 connection.maxBodySize(0),设置为0,就可以得到不限响应长度的数据了。
完整代码就是
public String getImage(String caseId,String type) {
String imageData = "";
String url = PropKit.get("getImageUrl");
Connection connection = Jsoup.connect(url);
connection.method(Connection.Method.GET);
connection.timeout(24000);
connection.header("Content-Type", "multipart/form-data");
connection.ignoreHttpErrors(true);
connection.ignoreContentType(true);
connection.maxBodySize(0);
Map map = new HashMap();
map.put("_id", caseId);
map.put("type", type);
connection.data(map);
Response response;
try {
response = connection.execute();
if (response.statusCode() == HttpStatus.OK_200) {
//throw new Exception("http请求响应码:" + response.statusCode() + "");
Gson gson = new Gson();
String body = response.body();
Map resultMap = gson.fromJson(body, HashMap.class);
imageData = (String) ((Map)resultMap.get("data")).get("image");
System.out.println(response.body());
}else{
logger.error("http请求响应码:" + response.statusCode() );
}
} catch (IOException e) {
e.printStackTrace();
}
return imageData;
}