cn.net.wanmo.common.send.SendUtil Maven / Gradle / Ivy
package cn.net.wanmo.common.send;
import cn.net.wanmo.common.http.apache.HttpApacheResult;
import cn.net.wanmo.common.http.apache.HttpApacheUtil;
import cn.net.wanmo.common.http.jdk.HttpJdkUtil;
import cn.net.wanmo.common.http.jdk.pojo.ResData;
import cn.net.wanmo.common.result.HttpResult;
import cn.net.wanmo.common.util.DateUtil;
import cn.net.wanmo.common.util.ObjectUtil;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class SendUtil {
private static final Logger logger = LoggerFactory.getLogger(SendUtil.class);
/**
* 发送 get 请求,请求体的 toString() 应该是 name1=value1&name2=value2 的形式
*
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj get(
String title, String url, ReqObj req, ResObj res, Map header) {
return exec(SendWay.GET, title, url, req, res, header);
}
/**
* 发送 get 请求,请求体的 toString() 应该是 name1=value1&name2=value2 的形式
*
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj getFile(
String title, String url, ReqObj req, ResObj res, Map header) {
return exec(SendWay.GET_FILE, title, url, req, res, header);
}
/**
* 发送 post 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
*
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj post(
String title, String url, ReqObj req, ResObj res, Map header) {
return exec(SendWay.POST, title, url, req, res, header);
}
/**
* 发送 post 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
*
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj postFile(
String title, String url, ReqObj req, ResObj res, Map header) {
return exec(SendWay.POST_FILE, title, url, req, res, header);
}
/**
* 发送 upload 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
*
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj upload(
String title, String url, ReqObj req, ResObj res, Map header) {
return exec(SendWay.UPLOAD, title, url, req, res, header);
}
/**
* 发送 http 请求
*
* @param sendWay 请求方式
* @param title 接口名称
* @param url 请求地址
* @param req 请求对象
* @param res 响应对象
* @param header 通用的请求属性
* @param 请求对象类型
* @param 响应对象类型
* @return 响应数据
*/
public static ResObj exec(
SendWay sendWay, String title, String url, ReqObj req, ResObj res, Map header) {
res.setTitle(title);
try {
MyHttpRes myHttpRes = getMyRes01(sendWay, title, url, req, header);
{
res.setErrCode(ObjectUtil.cast(myHttpRes.code));
res.setErrMsg(myHttpRes.msg);
res.setHeaders(myHttpRes.headers);
res.setSuccessHttp(myHttpRes.ok);
}
if (myHttpRes.ok) { // 请求 HTTP 成功
logger.debug(title + "接口响应头:{}", myHttpRes.headers);
logger.debug(title + "接口响应体:{}", myHttpRes.body);
res.setBody(myHttpRes.body); // 设置响应体的同时, 会将响应的 错误码和错误内容 解析到 res 中, 并根据默认的成功码 判断是否执行成功
if (res.isSuccessData()) { // 接口响应成功数据
logger.debug(title + "接口成功:{}", res.toJSONString());
} else { // 接口响应失败数据
logger.warn(title + "接口失败:{}", res.toJSONString());
}
} else { // 请求 HTTP 失败
logger.warn(title + "请求 HTTP 失败:{} {}", myHttpRes.code, myHttpRes.msg);
}
} catch (Exception e) { // 执行异常
res.setErrCode(ObjectUtil.cast(500));
res.setErrMsg("请求 HTTP 异常");
logger.error(title + res.getErrMsg(), e);
}
{
res.setResTime(DateUtil.nowLong()); // 设置响应时间
res.setConsumeTime(res.getResTime() - req.getReqTime()); // 计算耗时
}
return res;
}
private static MyHttpRes getMyRes01(
SendWay sendWay, String title, String url, ReqObj req, Map header) {
MyHttpRes myRes = new MyHttpRes();
HttpResult httpResult = null;
{ // 执行 HTTP 请求
String reqBody = req.getReqBody();
logger.debug(title + "接口URL:{}", url);
logger.debug(title + "接口请求体:{}", reqBody);
switch (sendWay) {
case GET:
httpResult = HttpJdkUtil.get(url).header(header).send();
break;
case GET_FILE:
httpResult = HttpJdkUtil.get(url).header(header).send(true);
break;
case POST:
httpResult = HttpJdkUtil.post(url).header(header).body(reqBody).send();
break;
case POST_FILE:
httpResult = HttpJdkUtil.post(url).header(header).body(reqBody).send(true);
break;
case UPLOAD:
HttpJdkUtil httpJdkUtil = HttpJdkUtil.post(url).header(header);
BaseReq.ReqFile reqFile = req.getReqFile();
if (Objects.nonNull(reqFile)) {
httpJdkUtil.form(reqFile.getName(), reqFile.getFile(), reqFile.getFilename());
}
httpResult = httpJdkUtil.send();
break;
default:
httpResult = new HttpResult<>();
httpResult.error("该 HTTP 请求方式不支持");
}
}
myRes.code = httpResult.getCode();
myRes.msg = httpResult.getMsg();
myRes.ok = httpResult.isSuccess();
if (httpResult.isSuccess()) {
ResData data = httpResult.getData();
myRes.body = data.getBody();
myRes.headers = data.getHeaders();
}
return myRes;
}
private static MyHttpRes getMyRes02(
SendWay sendWay, String title, String url, ReqObj req, Map header) {
MyHttpRes myRes = new MyHttpRes();
HttpApacheResult result = null;
{ // 执行 HTTP 请求
String reqBody = req.getReqBody();
logger.debug(title + "接口URL:{}", url);
logger.debug(title + "接口请求体:{}", reqBody);
switch (sendWay) {
case GET:
result = HttpApacheUtil.get(url).header(header).execute();
break;
case GET_FILE:
result = HttpApacheUtil.get(url).header(header).execute(true);
break;
case POST:
result = HttpApacheUtil.post(url).header(header).body(reqBody).execute();
break;
case POST_FILE:
result = HttpApacheUtil.post(url).header(header).body(reqBody).execute(true);
break;
case UPLOAD:
HttpApacheUtil apacheUtil = HttpApacheUtil.post(url).header(header);
BaseReq.ReqFile reqFile = req.getReqFile();
if (Objects.nonNull(reqFile)) {
apacheUtil.form(reqFile.getName(), reqFile.getFile(), reqFile.getFilename());
}
result = apacheUtil.execute();
break;
default:
result = new HttpApacheResult();
result.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
result.setMessage("该 HTTP 请求方式不支持");
}
}
myRes.code = result.getStatusCode();
myRes.msg = result.getMessage();
myRes.ok = result.isOk();
if (result.isOk()) {
myRes.body = result.body();
myRes.headers = result.headers();
}
return myRes;
}
static class MyHttpRes {
private Integer code;
private String msg;
private boolean ok;
private String body;
private Map> headers;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy