【Java】JSOUP请求JSON 及解决jsoup不能完整获取响应内容的问题

用JSOUP来请求接口,构造请求头的时候非常方便。代码如下:

Document doc = Jsoup
		.connect(Constant.DATA_URL)
		.timeout(10000).get();
Element body = doc.body();
JSONObject json = JSONObject.fromObject(body.text());

 但是出现问题了,请求就报错:

org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml. Mimetype=application/json;charset=UTF-8, URL=http://www.baidu.com/
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:600)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:540)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:216)

找了如下解决方案:

String body =Jsoup
                 .connect(Constant.DATA_URL)
                 .timeout(100000)
                 .ignoreContentType(true)
                 .execute()
                 .body();
body = body.replaceAll("\\n", "");

上面其实关键点在于:ignoreContentType(true) ,这个是忽略请求类型。建议用execute() 去执行,如果用get 去执行的话,返回来是一个 HTML  页面包裹的 JSON  ,你处理起来稍微有点费劲。

而且你要处理换行, JSON  正确的格式是一行返回,多行的话转成 JSON  对象的时候就会报错。所以还是推荐用execute() 去执行。

当使用jsoup访问http的接口时,但如果遇到不能完整获取响应内容时,一般有以下几个原因。

1. 网络异常,造成读取不全。这个很少发生,因为jsoup会报告exception

2. 网络超时,此时可以设置 connection.timeout(n) 增加超时时间。

3. 一切看起来都正常,也没有异常发生。 但是获取的数据就是少了一截。

这里主要将第三点。

仔细分析获取到的数据,发现得到数据都是1024k。

如果获取到的数据不超过1024k,程序正常,得到的数据也正常。

一旦数据超过1024k时,数据就只有预期得到数据的前1024k字节了。

仔细查找jsoup的api 发现,默认设置下,jsoup最大获取的响应长度正好时1M。

所以这个时候只要设置 connection.maxBodySize(0),设置为0,就可以得到不限响应长度的数据了。
 

String body =Jsoup
                 .connect(Constant.DATA_URL)
                 .timeout(100000)
                 .maxBodySize(0)
                 .ignoreContentType(true)
                 .execute()
                 .body();

body = body.replaceAll("\\n", "");

方法二:

InputStreamReader reader = null;
BufferedReader in = null;
try {
	URL url = new URL(Constant.DATA_URL);
	URLConnection connection = url.openConnection();
	connection.setConnectTimeout(1000);
	reader = new InputStreamReader(connection.getInputStream(), "UTF-8");
	in = new BufferedReader(reader);
	String line = null; // 每行内容
	StringBuffer content = new StringBuffer();
	while ((line = in.readLine()) != null) {
		content.append(line);
	}
	if (StringUtils.isNotBlank(content)) {
		String jsonStr = content.toString().replaceAll("\\n", "");
		data = JSONObject.fromObject(jsonStr);
	}
} catch (SocketTimeoutException e) {
	System.out.println("连接超时!!!");
} catch (JSONException e) {
	System.out.println("网站响应不是json格式,无法转化成JSONObject!!!");
} catch (Exception e) {
	System.out.println("连接网址不对或读取流出现异常!!!");
} finally {
	if (in != null) {
		try {
			in.close();
		} catch (IOException e) {
			System.out.println("关闭流出现异常!!!");
		}
	}
	if (reader != null) {
		try {
			reader.close();
		} catch (IOException e) {
			System.out.println("关闭流出现异常!!!");
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值