java 调用Http第三方接口

1,000 阅读2分钟

1、maven坐标

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.6</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2、调用http接口返回的数据模板

import cn.hutool.json.JSON;
import lombok.Data;

/**
 * 接口返回模板
 */
@Data
public class ResponseDataVo {

    private Integer status;
    private JSON result;
}

3、封装的异常类

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 封装的异常类
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class OpenApiInvokeException extends RuntimeException {

    private final String targetUrl;
    private final String message;

    public OpenApiInvokeException(String targetUrl, String message) {
        this.targetUrl = targetUrl;
        this.message = message;
    }
}

4、调用http的第三方接口(get、post)

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.*;
import cn.hutool.json.JSONUtil;

import java.util.Map;

/**
 * 调用http接口工具类
 */
public class HttpClientUtil {

    private final String apiHost;

    public HttpClientUtil(String apiHost) {
        this.apiHost = apiHost;
    }

    /**
     * 该get请求方法仅支持?传参。例如:http://localhost:9090/api/getMethod?name=xxx&age=12
     * @param method 请求方法
     * @param apiUrl 请求的uri
     * @param queryParams 请求参数
     * @return
     */
    public ResponseDataVo httpGet(final Method method, final String apiUrl, Map<String, Object> queryParams){
        final StringBuilder queryString = new StringBuilder();
        if (null != queryParams) {
            // 将queryParams转换为queryString(key=val&key2=val2)
            for (final String key : queryParams.keySet()) {
                queryString.append(StrUtil.format("{}={}", key, queryParams.get(key))).append("&");
            }
            if (!queryParams.isEmpty()) {
                queryString.deleteCharAt(queryString.length() - 1);
            }
        }
        final HttpRequest httpRequest = HttpUtil.createRequest(method, StrUtil.format("{}/{}{}",
                this.apiHost, apiUrl, queryString.length() > 0 ? ("?" + queryString.toString()) : ""));
        return this.doInvoke(httpRequest);
    }


    /**
     * 该post请求方法仅支持body传参
     * @param method 请求方法
     * @param apiUrl 请求的uri
     * @param requestBody body请求参数
     * @return
     */
    public ResponseDataVo httpPost(final Method method, final String apiUrl, final Map<String, Object> requestBody){
        // 将requestBody转换为JSON字符串
        final String requestBodyString = null != requestBody ? JSONUtil.toJsonStr(requestBody) : null;
        HttpRequest httpRequest = HttpUtil.createPost(this.apiHost + "/" + apiUrl);
        if (null != requestBodyString) {
            httpRequest.body(requestBodyString, ContentType.JSON.toString());
        }
        return this.doInvoke(httpRequest);
    }

    /**
     * 公共调用http方法
     * @param httpRequest
     * @return
     */
    private ResponseDataVo doInvoke(HttpRequest httpRequest) {
        try {
            //httpRequest.header("xxx","xxx"); 添加header可选,需要可以设置添加;这里不需要,就没有添加,做下提示
            final HttpResponse httpResponse = httpRequest.execute();
            if (!httpResponse.isOk()){
                throw new OpenApiInvokeException(httpRequest.getUrl(),
                        "HttpStatus is " + httpResponse.getStatus() + ", Body is " + httpResponse.body());
            }
            return JSONUtil.toBean(httpResponse.body(), ResponseDataVo.class);
        } catch (OpenApiInvokeException e) {
            e.printStackTrace();
        } catch (HttpException e) {
            e.printStackTrace();
        }
        return null;
    }
}

5、对4工具类的测试用例

import cn.hutool.core.map.MapUtil;
import cn.hutool.http.Method;

import java.util.HashMap;
import java.util.Map;

public class HttpTest {

    public static void main(String[] args) {
        String apiHost = "http://localhost:9090";
        HttpClientUtil httpClientUtil = new HttpClientUtil(apiHost);
        String getApiUrl = "/api/test/getMethod";
        String postApiUrl = "/api/test/postMethod";
        Map<String, Object> queryParams = MapUtil.builder(new HashMap<String, Object>())
                .put("name", "tom")
                .put("age", 12)
                .map();
        Map<String, Object> requestBody = MapUtil.builder(new HashMap<String, Object>())
                .put("address", "tianjin")
                .put("org", "A组")
                .map();
        //get调用
        ResponseDataVo httpGetDataVo = httpClientUtil.httpGet(Method.GET, getApiUrl, queryParams);
        System.out.println("========get请求结果=========== " + httpGetDataVo.getResult());
        //post调用
        ResponseDataVo httpPostDataVo = httpClientUtil.httpPost(Method.POST, postApiUrl, requestBody);
        System.out.println("========post请求结果=========== " + httpGetDataVo.getResult());
    }
}

这里整理一下,比较简单。网上找的有的都不能用,以后再用到,直接用就好了。学习记录一下,勿喷!