本文参与「新人创作礼」活动,一起开启掘金创作之路。
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、运行结果
7、小结:相当于把每个具体请求单独封装,调用的时候根据其bean名称进行调用