目前项目使用的是微服务,但是.net团队有需要调用javaAPI的地方,一部分javaWeb的项目也会有调用javaApi的时候,下边提供Http调用的代码以及,解析Json数据为Java实体和Java数组的代码。
urlstr ,user ,password 为获取token的链接,账号密码
/**
* 获取本地token 方法
*/
public static String getToken() throws IOException {
String urlstr = "https://xxx.xxxx.com.cn/oauth/token";
String user = "xxx";
String password = "xxxx";
StringBuilder data = new StringBuilder();
URL url = new URL(urlstr);
// 打开和URL之间的连接
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");//请求post方式
con.setUseCaches(false); // Post请求不能使用缓存
con.setDoInput(true);// 设置是否从HttpURLConnection输入,默认值为 true
con.setDoOutput(true);// 设置是否使用HttpURLConnection进行输出,默认值为 false
//设置header内的参数 connection.setRequestProperty("健, "值");
String authString = user + ":" + password;
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
con.setRequestProperty("Authorization", "Basic " + authStringEnc);
//设置body内的参数,put到JSONObject中
String lineStart = "--";
String boundary = "FlPm4LpSXsE"; // 数据分隔符
String lineEnd = "\r\n";
con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
StringBuilder sb = new StringBuilder();
sb.append(lineStart + boundary + lineEnd);
sb.append("Content-Disposition: form-data; name=\"grant_type\"" + lineEnd);
sb.append(lineEnd);
sb.append("client_credentials" + lineEnd);
sb.append(lineStart + boundary + lineEnd);
sb.append("Content-Disposition: form-data; name=\"scope\"" + lineEnd);
sb.append(lineEnd);
sb.append("all" + lineEnd);
String ss = "\r\n--" + boundary + "--\r\n";
sb.append(ss);
DataOutputStream output = new DataOutputStream(con.getOutputStream());
try {
output.write(sb.toString().getBytes("utf-8"), 0, sb.toString().getBytes("utf-8").length);// 发送表单字段数据
output.flush();
output.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
// 获取服务端响应,通过输入流来读取URL的响应
InputStream is = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
// 关闭连接
con.disconnect();
// 打印读到的响应结果
System.out.println("运行结束:" + sbf.toString());
String obj = sbf.toString();
JSONObject jo = JSON.parseObject(obj);
String token = jo.getString("access_token");
return token;
}
public static String doGet(String httpUrl) throws IOException {
//根据实际情况写入acces_token,大多数在headers,我的方式是query的方式,是直接显示在url上的(不推荐)
// String api = YXW_API.getYXW_API();
//有参数
if (httpUrl.contains("?")) {
httpUrl = YXW_API + httpUrl + "&access_token=" + getToken();
} else {
httpUrl = YXW_API + httpUrl + "?access_token=" + getToken();
}
// System.out.println("请求地址为:"+httpUrl);
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;// 返回结果字符串
try {
// 创建远程url连接对象
URL url = new URL(httpUrl);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
StringBuffer sbf = new StringBuffer();
String temp = null;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
connection.disconnect();// 关闭远程连接
}
log.info("API接口GET请求地址为:{}", httpUrl);
return result;
}
public static String doPost(String httpUrl, String param) {
httpUrl = YXW_API + httpUrl;
HttpURLConnection connection = null;
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
String result = null;
try {
URL url = new URL(httpUrl);
// 通过远程url连接对象打开连接
connection = (HttpURLConnection) url.openConnection();
// 设置连接请求方式
connection.setRequestMethod("POST");
// 设置连接主机服务器超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取主机服务器返回数据超时时间:60000毫秒
connection.setReadTimeout(60000);
// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
connection.setDoOutput(true);
// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
connection.setDoInput(true);
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
// 通过连接对象获取一个输出流
os = connection.getOutputStream();
// 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
os.write(param.getBytes());
int code = connection.getResponseCode();
System.out.println(code);
// 通过连接对象获取一个输入流,向远程读取
if (code == 200) {
is = connection.getInputStream();
// 对输入流对象进行包装:charset根据工作项目组的要求来设置
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String temp = null;
// 循环遍历一行一行读取数据
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
} else {
result = "返回错误。ResponseCode: " + code;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接
connection.disconnect();
}
log.info("API接口POST请求地址为:{}", httpUrl);
return result;
}
首先restful’形式的接口,一般会定义固定的返回方式,我的为code,data,msg
@Data
public class ResponseVO<T> {
private int code;
private String msg;
private T data;
}
ResponseVO<DearLine> responseVO = null;
try {
String s = APIHelper.Get("xxxx/dxxxxxx/getxxxxxxInfo?xxId=" + id;
JSONObject jsonObject = JSON.parseObject(s);
responseVO = JSONObject.toJavaObject(jsonObject, ResponseVO.class);
if (responseVO.getCode() == 0) {
Object data = responseVO.getData();
JSONObject jo1 = JSON.parseObject(data.toString());
DearLine dearLine = JSONObject.toJavaObject(jo1, DearLine.class);
record.setDearLine(dearLine);
} else {
throw new RuntimeException("获取xxxxx信息失败");
}
} catch (Exception e) {
System.out.println(e.getMessage());
log.error("获取xxxx信息 error:", e);
}
ResponseVO<List<xxxx>> responseVO = null;
List<xxxx> listVos = new ArrayList<>();
try {
String s = APIHelper.Get("xxxx/xxxx/xxxx");
JSONObject jsonObject = JSON.parseObject(s);
responseVO = JSONObject.toJavaObject(jsonObject, ResponseVO.class);
if (responseVO.getCode() == 0) {
JSONArray jsonArray = jsonObject.getJSONArray("data");
listVos = JSON.parseArray(jsonArray.toJSONString(), xxxx.class);
} else {
throw new RuntimeException("获取xxxx信息失败");
}
} catch (Exception e) {
System.out.println(e.getMessage());
log.error("获取xxxx信息 error:", e);
}
复制使用即可,亲民好用
附上依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>