All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.net.wanmo.common.send.SendUtil Maven / Gradle / Ivy

There is a newer version: 1.3.9
Show newest version
package cn.net.wanmo.common.send;

import cn.net.wanmo.common.http.HttpReq;
import cn.net.wanmo.common.http.enums.Method;
import cn.net.wanmo.common.http.enums.ResType;
import cn.net.wanmo.common.http.pojo.ResData;
import cn.net.wanmo.common.http.pojo.Uploader;
import cn.net.wanmo.common.restful.SendWay;
import cn.net.wanmo.common.result.HttpResult;
import cn.net.wanmo.common.result.InterfaceResult;
import cn.net.wanmo.common.util.DateUtil;
import cn.net.wanmo.common.util.ObjectUtil;
import org.slf4j.Logger;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class SendUtil {

    /**
     * 发送 get 请求,请求体的 toString() 应该是 name1=value1&name2=value2 的形式
     *
     * @param msgPre   接口名称
     * @param url      请求地址
     * @param req      请求对象
     * @param res      响应对象
     * @param header   通用的请求属性
     * @param logger   日志对象
     * @param  请求对象类型
     * @param  响应对象类型
     * @return 响应数据
     */
    public static , Code extends Serializable> InterfaceResult get(
            String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, Class codeClass) {
        return exec(msgPre, url, req, res, header, logger, SendWay.GET, codeClass);
    }

    /**
     * 发送 get 请求,请求体的 toString() 应该是 name1=value1&name2=value2 的形式
     *
     * @param msgPre   接口名称
     * @param url      请求地址
     * @param req      请求对象
     * @param res      响应对象
     * @param header   通用的请求属性
     * @param logger   日志对象
     * @param  请求对象类型
     * @param  响应对象类型
     * @return 响应数据
     */
    public static , Code extends Serializable> InterfaceResult getFile(
            String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, Class codeClass) {
        return exec(msgPre, url, req, res, header, logger, SendWay.GET_FILE, codeClass);
    }


    /**
     * 发送 post 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
     *
     * @param msgPre   接口名称
     * @param url      请求地址
     * @param req      请求对象
     * @param res      响应对象
     * @param header   通用的请求属性
     * @param logger   日志对象
     * @param  请求对象类型
     * @param  响应对象类型
     * @return 响应数据
     */
    public static , Code extends Serializable> InterfaceResult post(
            String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, Class codeClass) {
        return exec(msgPre, url, req, res, header, logger, SendWay.POST, codeClass);
    }

    /**
     * 发送 post 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
     *
     * @param msgPre   接口名称
     * @param url      请求地址
     * @param req      请求对象
     * @param res      响应对象
     * @param header   通用的请求属性
     * @param logger   日志对象
     * @param  请求对象类型
     * @param  响应对象类型
     * @return 响应数据
     */
    public static , Code extends Serializable> InterfaceResult postFile(
            String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, Class codeClass) {
        return exec(msgPre, url, req, res, header, logger, SendWay.POST_FILE, codeClass);
    }


    /**
     * 发送 upload 请求,请求体的 toString() 应该是 json 字符串。例如: {name1:value1,name2:value2}
     *
     * @param msgPre   接口名称
     * @param url      请求地址
     * @param req      请求对象
     * @param res      响应对象
     * @param header   通用的请求属性
     * @param logger   日志对象
     * @param  请求对象类型
     * @param  响应对象类型
     * @return 响应数据
     */
    public static , Code extends Serializable> InterfaceResult upload(
            String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, Class codeClass) {
        return exec(msgPre, url, req, res, header, logger, SendWay.UPLOAD, codeClass);
    }


    /**
     * 发送 http 请求
* get要求请求体:请求参数应该是 name1=value1&name2=value2 的形式 * * @param msgPre 接口名称 * @param url 请求地址 * @param req 请求对象 * @param res 响应对象 * @param header 通用的请求属性 * @param logger 日志对象 * @param sendWay 请求方式 * @param 请求对象类型 * @param 响应对象类型 * @return 响应数据 */ public static , Code extends Serializable> InterfaceResult exec( String msgPre, String url, ReqObj req, ResObj res, Map header, Logger logger, SendWay sendWay, Class codeClass) { InterfaceResult result = new InterfaceResult<>(); try { HttpResult httpResult = null; { // 执行 HTTP 请求 String reqBody = req.getBody(); logger.debug(msgPre + "接口请求体:{}", reqBody); switch (sendWay) { case GET: httpResult = HttpReq.get().setUrl(url).setHeader(header).send(); break; case GET_FILE: httpResult = HttpReq.get().setUrl(url).setHeader(header).setResType(ResType.file).send(); break; case POST: httpResult = HttpReq.post().setUrl(url).setHeader(header).setBody(reqBody).send(); break; case POST_FILE: httpResult = HttpReq.post().setUrl(url).setHeader(header).setBody(reqBody).setResType(ResType.file).send(); break; case UPLOAD: List uploaders = Arrays.asList(req.getUploader()); httpResult = HttpReq.upload().setUrl(url).setHeader(header).setUploaderList(uploaders).send(); break; default: httpResult = new HttpResult<>(); httpResult.error("该 HTTP 请求方式不支持"); } } if (httpResult.isSuccess()) { // 请求 HTTP 成功 ResData resData = httpResult.getData(); logger.debug(msgPre + "接口响应头:{}", resData.getHeaders()); logger.debug(msgPre + "接口响应体:{}", resData.getBody()); res.setBody(resData.getBody()); // 设置响应体的同时, 会将响应的 错误码和错误内容 解析到 res 中, 并根据默认的成功码 判断是否执行成功 res.setResTime(DateUtil.nowLong()); // 设置响应时间 res.setConsumeTime(res.getResTime() - req.getReqTime()); // 计算耗时 if (res.isSuccess()) { // 接口响应成功数据 result.success(msgPre + res.getErrMsg(), res); logger.debug(msgPre + "接口成功:{}", result.toJSONString()); } else { // 接口响应失败数据 result.fail(String.valueOf(res.getErrCode()), msgPre + res.getErrMsg(), res); logger.warn(msgPre + "接口失败:{}", result.toJSONString()); } result.setConsumeTime(res.getConsumeTime()); logger.debug(msgPre + "接口完成:{}", result.toJSONString()); } else { // 请求 HTTP 失败 res.setErrCode(ObjectUtil.cast(httpResult.getCode())); res.setErrMsg(httpResult.getMsg()); res.setResTime(DateUtil.nowLong()); // 设置响应时间 res.setConsumeTime(res.getResTime() - req.getReqTime()); // 计算耗时 result.error(String.format("%s接口调用失败:HTTP状态码 (%d),HTTP错误消息 (%s)", msgPre, httpResult.getCode(), httpResult.getMsg()), res); result.setConsumeTime(res.getConsumeTime()); logger.warn(msgPre + "请求 HTTP 失败:{}", result.toJSONString()); } } catch (Exception e) { // 执行异常 res.setErrCode(ObjectUtil.cast(500)); res.setErrMsg(e.getMessage()); res.setResTime(DateUtil.nowLong()); // 设置响应时间 res.setConsumeTime(res.getResTime() - req.getReqTime()); // 计算耗时 result.error(msgPre + "请求 HTTP 异常:" + e.getMessage(), res); result.setConsumeTime(res.getConsumeTime()); logger.error(result.getMsg(), e); } return result; } }