完美解决HttpURLConnection获取数据不全问题
问题:外部接口返回xml时,时而获取正确,时而获取一部分数据
package com.weijy.utils;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
/**
* @author: weijy
*
* <pre>
* 功能:httpUrlConnection访问远程接口工具
* 日期:2021年10月12日 上午10:19:21
* </pre>
*/
public class HttpUrlConnectionUtil {
/**
* <pre>
* 方法体说明:向远程接口发起请求,返回字符串类型结果
* @param url 接口地址
* @param requestMethod 请求方式
* @param params 传递参数 重点:参数值需要用Base64进行转码
* @return String 返回结果
* </pre>
*/
public static String httpRequestToString(String url, String requestMethod,
Map<String, String> params){
String result = null;
try {
InputStream is = httpRequestToStream(url, requestMethod, params);
//方式一
ByteArrayOutputStream data = new ByteArrayOutputStream();
//设置接收附件最大10MB
byte [] fileByte = new byte[10*1024*1024];
int len =0;
while((len=is.read(fileByte))!=-1) {
data.write(fileByte,0,len);
}
//方式二
//网络不好时,数据接受不全,适用于本地获取
/*
byte[] b = new byte[is.available()];
is.read(b);
result = new String(b);*/
result = data.toString();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* <pre>
* 方法体说明:向远程接口发起请求,返回字节流类型结果
* 作者:weijy
* 日期:2021年10月13日 上午11:20:25
* @param url 接口地址
* @param requestMethod 请求方式
* @param params 传递参数 重点:参数值需要用Base64进行转码
* @return InputStream 返回结果
* </pre>
*/
public static InputStream httpRequestToStream(String url, String requestMethod,
Map<String, String> params){
InputStream is = null;
try {
String parameters = "";
boolean hasParams = false;
//将参数集合拼接成特定格式,如name=zhangsan&age=24
if (params != null) {
for(String key : params.keySet()){
String value = URLEncoder.encode(params.get(key), "UTF-8");
parameters += key +"="+ value +"&";
hasParams = true;
}
}
if(hasParams){
parameters = parameters.substring(0, parameters.length()-1);
}
//请求方式是否为get
boolean isGet = "get".equalsIgnoreCase(requestMethod);
//请求方式是否为post
boolean isPost = "post".equalsIgnoreCase(requestMethod);
if(isGet){
url += "?"+ parameters;
}
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
//请求的参数类型(使用restlet框架时,为了兼容框架,必须设置Content-Type为“”空)
conn.setRequestProperty("Content-Type", "application/octet-stream");
//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置连接超时时间
conn.setConnectTimeout(50000);
//设置读取返回内容超时时间
conn.setReadTimeout(50000);
//设置向HttpURLConnection对象中输出,因为post方式将请求参数放在http正文内,因此需要设置为ture,默认false
if(isPost){
conn.setDoOutput(true);
}
//设置从HttpURLConnection对象读入,默认为true
conn.setDoInput(true);
//设置是否使用缓存,post方式不能使用缓存
if(isPost){
conn.setUseCaches(false);
}
//设置请求方式,默认为GET
conn.setRequestMethod(requestMethod);
//post方式需要将传递的参数输出到conn对象中
if(isPost){
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(parameters);
dos.flush();
dos.close();
}
//从HttpURLConnection对象中读取响应的消息
//执行该语句时才正式发起请求
is = conn.getInputStream();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
}
参考:https://blog.youkuaiyun.com/huijiaaa1/article/details/89727442
https://www.iteye.com/blog/javatea-2422253
本文介绍如何完美解决使用Java的HttpURLConnection在对接外部接口时遇到的XML数据接收不完整的问题,详细分析了问题原因并提供了解决方案。
505

被折叠的 条评论
为什么被折叠?



