结合restTemple封装一个外部接口请求组件

175 阅读2分钟

本文参与「新人创作礼」活动,一起开启掘金创作之路。

我的变强之路

1、将请求外部接口的一些通用行为(请求头、请求地址、请求参数、请求、请求结果)抽离进行封装

package com.dwk.common;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;

public abstract class CommonRest<T> {

    private static final Logger log = LoggerFactory.getLogger(CommonRest.class);

    @Autowired
    protected CommonProperties properties;

    /**请求入口*/
    public T run() {
        T data = null;
        String url = null;
        try {
            long start = System.currentTimeMillis();
            url = getUrl();
            Assert.notNull(url,"请求地址不能为空!");
            log.info("====>请求地址  " + url);

            HttpHeaders requestHead = buildHead();
            if (requestHead == null || ObjectUtils.isEmpty(requestHead)) {
                log.info("====>请求头为空");
            } else {
                log.info("====>组织请求头  " + new JSONObject(requestHead));
            }

            Object requestBody = buildBody();
            if (requestBody == null || ObjectUtils.isEmpty(requestBody)) {
                log.info("====>请求体为空");
            } else {
                log.info("====>组织请求体  " + requestBody.toString());
            }

            Object result = request(url,requestHead,requestBody);
            if (requestBody == null || ObjectUtils.isEmpty(requestBody)) {
                log.info("====>请求结果为空");
            } else {
                log.info("====>请求结果  " + result.toString());
            }

            data = resultHandle(result);
            if (data == null || ObjectUtils.isEmpty(data)) {
                log.info("====>请求结果为空");
            } else {
                log.info("====>处理请求结果  "+data.toString());
            }

            long end = System.currentTimeMillis();
            log.info("====>请求耗时  " + (end - start)/1000 + "秒");
        } catch (Exception e) {
            log.error("请求"+url+"失败");
            e.printStackTrace();
        }
        return data;
    }

    /**获取url并初始化请求参数*/
    public abstract String getUrl();

    /**构造请求头*/
    public abstract HttpHeaders buildHead();

    /**构造请求体*/
    public abstract Object buildBody();

    /**发送请求*/
    public abstract Object request(String url,HttpHeaders requestHead,Object requestBody);

    /**处理返回值*/
    public abstract T resultHandle(Object result);

}

2、自定义的配置文件用来配置请求地址和一些固定参数等

package com.dwk.common;

import com.dwk.properties.GetProperties;
import com.dwk.properties.PostProperties;
import lombok.Data;
import org.springframework.stereotype.Component;

/**
所有的接口配置全部封装在一个配置类中方便统一管理
*/
@Data
@Component
public class CommonProperties{

    private GetProperties getProperties = new GetProperties();

    private PostProperties postProperties = new PostProperties();

}

3、详细的自定义配置类

package com.dwk.properties;

import lombok.Data;

@Data
public class GetProperties {

    private String url = "https://so.csdn.net";

    private String appKey;

    private String secret;

}

4、实现具体接口逻辑处理

package com.dwk.request;


import com.dwk.common.CommonRest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

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

@Component("getRequest")
public class GetRequest extends CommonRest<Object> {

    @Override
    public String getUrl() {
        return properties.getGetProperties().getUrl();
    }

    @Override
    public HttpHeaders buildHead() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("test","test");
        return httpHeaders;
    }

    @Override
    public Object buildBody() {
        Map body = new HashMap();
        body.put("test","test");
        return body;
    }

    @Override
    public Object request(String url, HttpHeaders requestHead, Object requestBody) {
        RestTemplate restTemplate = new RestTemplate();
        HttpEntity<Object> objectHttpEntity = new HttpEntity<>(requestBody, requestHead);
        ResponseEntity<String> result = restTemplate.getForEntity(url, String.class);
        return result;
    }

    @Override
    public Object resultHandle(Object result) {
        //JSONObject jsonObject = JSONObject.parseObject(result.toString());
        System.out.println("html文件返回,就不处理了!!!");
        return result.toString();
    }
}

5、控制类

package com.dwk.controller;

import com.dwk.common.CommonRest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class TestController {

    @Autowired
    private Map<String, CommonRest> commonRestMap;

    @RequestMapping(value = "/getTest",method = RequestMethod.GET)
    public void testGet(){
        commonRestMap.get("getRequest").run();
    }

    @RequestMapping(value = "/postTest",method = RequestMethod.POST)
    public void testPost(){
        commonRestMap.get("postRequest").run();
    }

}

6、运行结果

image.png

7、小结:相当于把每个具体请求单独封装,调用的时候根据其bean名称进行调用