最佳实践:
场景
1、对接多个平台功能。
有一个功能需要对接多个平台接口,获取每个平台上客户自己的订单。亚马逊平台、淘宝平台、拼多多等。
这个时候我们的请求步骤都是一样的。请求的行为根据不同的平台有不同的参数设置
模板类
package org.example.strategyAndTemplate;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import javax.annotation.Resource;
import java.util.HashMap;
/**
* @author huangZhiLin
*/
public class HttpRequestTemplate {
@Resource
PlatformActionFactory platformActionFactory;
public String doHttpRequest(String platformCode, String params){
//1、获取平台请求地址
String url = getUrl(platformCode);
//获取平台请求头
HashMap<String, String> requestHead = getRequestHead(platformCode);
//获取平台请求体
String requestBody = getRequestBody(platformCode,params);
//发送请求
HttpResponse response = HttpUtil.createPost(url).addHeaders(requestHead).body(requestBody).execute();
//处理请求结果,并返回
return handlResult(platformCode,response);
}
private String handlResult(String platformCode, HttpResponse response) {
PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
return platformAction.handleResult(response.body());
}
private String getRequestBody(String platformCode, String params) {
PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
return platformAction.getRequestBody(platformCode, params);
}
private HashMap<String, String> getRequestHead(String platformCode) {
PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
return platformAction.getRequestHead(platformCode);
}
private String getUrl(String platformCode) {
PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
return platformAction.getUrl(platformCode);
}
}
平台行为接口
package org.example.strategyAndTemplate;
import java.util.HashMap;
/**
* @author huangZhiLin
*/
public interface PlatformAction {
/**
* 获取平台名称
* @return
*/
String getName();
/**
* 获取指定平台的 url
* @return
*/
String getUrl(String platformCode);
/**
* 获取指定平台请求头
* @param platformCode
* @return
*/
HashMap<String, String> getRequestHead(String platformCode);
/**
* 获取指定平台请求体
* @param platformCode
* @param params
* @return
*/
String getRequestBody(String platformCode, String params);
/**
* 获取请求token
* @param platformCode
* @param params
* @return
*/
String getToken(String platformCode, String params);
/**
* 处理请求返回的结果
* @param result
* @return
*/
String handleResult(String result);
}
平台实现类
package org.example.strategyAndTemplate;
import java.util.HashMap;
/**
* @author huangZhiLin
*/
public class EbayAction implements PlatformAction{
@Override
public String getName() {
return "EBAY";
}
@Override
public String getUrl(String platformCode) {
return "https://ebay.com";
}
@Override
public HashMap<String, String> getRequestHead(String platformCode) {
return new HashMap<>();
}
@Override
public String getRequestBody(String platformCode, String params) {
return "body";
}
@Override
public String getToken(String platformCode, String params) {
return "token";
}
@Override
public String handleResult(String result) {
//处理请求
return "success";
}
}
平台行为工厂
package org.example.strategyAndTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* @author huangZhiLin
*/
@Component
public class PlatformActionFactory implements ApplicationContextAware {
private Map<String, PlatformAction> platformActionMap;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, PlatformAction> actionMap = applicationContext.getBeansOfType(PlatformAction.class);
platformActionMap = new HashMap<>();
actionMap.forEach((key, value) -> platformActionMap.put(value.getName(), value));
}
public PlatformAction getPlatformAction(String platformCode){
return platformActionMap.get(platformCode);
}
}