package foundation.icall.connector;
|
|
import java.util.Map.Entry;
|
import java.util.concurrent.TimeUnit;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.dao.DataPackage;
|
import foundation.dao.DataReader;
|
import foundation.dao.bizlogic.DocDescription;
|
import foundation.dao.bizlogic.IRequest;
|
import foundation.dao.bizlogic.ResponseType;
|
import foundation.data.entity.Entity;
|
import foundation.handler.DataPool;
|
import foundation.handler.ResultPool;
|
import foundation.icall.ContentType;
|
import foundation.icall.ICall;
|
import foundation.icall.ICallDirection;
|
import foundation.icall.callout.HttpServerMeta;
|
import foundation.icall.callout.ICallRequest;
|
import foundation.icall.callout.IRemoteSource;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.icall.callout.MethodType;
|
import foundation.icall.callout.StreamResponse;
|
import foundation.io.template.Template;
|
import foundation.json.JObjectReader;
|
import foundation.server.ObjectCreator;
|
import foundation.util.MapList;
|
import foundation.workflow.WorkStep;
|
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient.Builder;
|
import okhttp3.Request;
|
import okhttp3.Response;
|
|
public abstract class HttpServerConn implements IRemoteSource {
|
|
protected static Logger logger;
|
public static int ConnectTimeout = 60;
|
public static int WriteTimeout = 60;
|
public static int ReadTimeout = 60;
|
|
protected HttpServerMeta meta;
|
private static OkHttpClient httpClient = null;
|
|
static {
|
logger = LogManager.getLogger(HttpServerConn.class);
|
}
|
|
protected HttpServerConn() {
|
Builder builder = new OkHttpClient.Builder();
|
builder.connectTimeout(ConnectTimeout, TimeUnit.SECONDS);
|
builder.writeTimeout(WriteTimeout, TimeUnit.SECONDS);
|
builder.readTimeout(ReadTimeout, TimeUnit.SECONDS);
|
|
httpClient = builder.build();
|
}
|
|
public void init(HttpServerMeta meta) {
|
this.meta = meta;
|
}
|
|
public static HttpServerConn newInstance(HttpServerMeta meta) throws Exception {
|
String className = meta.getClassName();
|
HttpServerConn instance = ObjectCreator.create(className);
|
instance.init(meta);
|
|
return instance;
|
}
|
|
public JObjectReader formatReader(DataReader requestReader) throws Exception {
|
return null;
|
}
|
|
public ResultPool echoSignature(ResultPool resultPool, DataPool dataPool) throws Exception {
|
return null;
|
}
|
|
public Entity systemLogin(DataPool dataPool) throws Exception {
|
return null;
|
}
|
|
public abstract void login(WorkStep step, ICall iCall) throws Exception;
|
|
public abstract void logout(WorkStep step, ICall iCall) throws Exception;
|
|
public abstract IRequest createRequest(String url);
|
|
public IRequest buildBody(IRequest request, WorkStep step, ICall iCall) throws Exception {
|
DataPackage dataPackage = step.getDataPackage();
|
MapList<String, Template> templateList = iCall.getRequestTemplateList();
|
Entity master = dataPackage.getMasterEntity(iCall.getRequestDataSources());
|
|
//1. 填充url
|
String url = request.getURL();
|
url = Template.fillStringVariants(url, dataPackage);
|
request.setURL(url);
|
|
//2. 填充参数
|
ContentType contentType = iCall.getContentType();
|
for (Entry<String, Template> entry : templateList.getItemMap().entrySet()) {
|
Template template = entry.getValue();
|
String key = entry.getKey();
|
|
String value = template.fillVariants(dataPackage);
|
System.out.println("value:" + value);
|
if ("jsonbody".equals(key)) {
|
request.setJSONBody(value);
|
}
|
else if (ContentType.TextPlain == contentType ){
|
request.addOneParam(entry.getKey(), value);
|
}
|
else {
|
request.addFormData(entry.getKey(), value);
|
}
|
}
|
|
if (master != null) {
|
request.setDocDescription(new DocDescription(master.getId(), master.getString("code")));
|
}
|
|
request.setContentType(iCall.getContentType().getCode());
|
return request;
|
}
|
|
@SuppressWarnings("unchecked")
|
public <T> T post(boolean simulate, IRequest request, ResponseType responseType) throws Exception {
|
//1. 如果测试状态,直接退出
|
if (simulate) {
|
if (ResponseType.JSON == responseType) {
|
return (T) new JSONResponse(null);
|
}
|
else if (ResponseType.Stream == responseType) {
|
return (T) new StreamResponse(null);
|
}
|
}
|
|
//2. 构建请求
|
T result = null;
|
ICallRequest iRequest = (ICallRequest)request;
|
Request.Builder builder = new Request.Builder();
|
builder.url(iRequest.getURL());
|
|
//3. 将 URL 设置到请求中
|
if (iRequest.existsParams()) {
|
iRequest.applyParams(builder);
|
}
|
|
//4. 将 headers 设置到请求中
|
if (iRequest.existsHeaders()) {
|
iRequest.applyHeaders(builder);
|
}
|
|
//5. 将 JSON Body 设置到请求中
|
if (iRequest.existsJSONBody()) {
|
iRequest.applyJSONBody(builder, MethodType.POST);
|
}
|
|
//6. 将 Form Body 设置到请求中
|
if (iRequest.existsFormBody()) {
|
iRequest.applyFormBody(builder, MethodType.POST);
|
}
|
|
//7. 发送请求
|
System.out.println("请求URL:" + iRequest.getURL());
|
Response response = httpClient.newCall(builder.build()).execute();
|
|
if (ResponseType.JSON == responseType){
|
result = (T) new JSONResponse(response);
|
}
|
else if (ResponseType.Stream == responseType) {
|
result = (T) new StreamResponse(response);
|
}
|
|
//8. 返回
|
return result;
|
}
|
|
@SuppressWarnings("unchecked")
|
public <T> T get(IRequest request, ResponseType responseType) throws Exception {
|
ICallRequest iRequest = (ICallRequest)request;
|
|
T result = null;
|
Request.Builder builder = new Request.Builder().get();
|
builder.url(iRequest.getURL());
|
//1. 将 URL 设置到请求中
|
if (iRequest.existsParams()) {
|
iRequest.applyParams(builder);
|
}
|
|
//2. 将 headers 设置到请求中
|
if (iRequest.existsHeaders()) {
|
iRequest.applyHeaders(builder);
|
}
|
|
//3. 发送请求
|
Response response = httpClient.newCall(builder.build()).execute();
|
|
if (ResponseType.JSON == responseType) {
|
result = (T) new JSONResponse(response);
|
}
|
else if (ResponseType.Stream == responseType) {
|
result = (T) new StreamResponse(response);
|
}
|
|
//5. 返回
|
return result;
|
}
|
|
public <T> T put(boolean simulate, IRequest request, ResponseType responseType) throws Exception {
|
//1. 如果测试状态,直接退出
|
if (simulate) {
|
if (ResponseType.JSON == responseType) {
|
return (T) new JSONResponse(null);
|
}
|
else if (ResponseType.Stream == responseType) {
|
return (T) new StreamResponse(null);
|
}
|
}
|
|
//2. 构建请求
|
T result = null;
|
ICallRequest iRequest = (ICallRequest)request;
|
Request.Builder builder = new Request.Builder();
|
builder.url(iRequest.getURL());
|
|
//3. 将 URL 设置到请求中
|
if (iRequest.existsParams()) {
|
iRequest.applyParams(builder);
|
}
|
|
//4. 将 headers 设置到请求中
|
if (iRequest.existsHeaders()) {
|
iRequest.applyHeaders(builder);
|
}
|
|
//5. 将 JSON Body 设置到请求中
|
if (iRequest.existsJSONBody()) {
|
iRequest.applyJSONBody(builder, MethodType.PUT);
|
}
|
|
//6. 将 Form Body 设置到请求中
|
if (iRequest.existsFormBody()) {
|
iRequest.applyFormBody(builder, MethodType.PUT);
|
}
|
|
//7. 发送请求
|
Response response = httpClient.newCall(builder.build()).execute();
|
|
if (ResponseType.JSON == responseType){
|
result = (T) new JSONResponse(response);
|
}
|
else if (ResponseType.Stream == responseType) {
|
result = (T) new StreamResponse(response);
|
}
|
|
//8. 返回
|
return result;
|
}
|
|
@Override
|
public Object get() {
|
return this;
|
}
|
|
public ICallDirection getDirection() {
|
return ICallDirection.RemoteServer;
|
}
|
|
public HttpServerMeta getMeta() {
|
return meta;
|
}
|
|
@Override
|
public String getName() {
|
return meta.getName();
|
}
|
|
public String getString(String elementKey) {
|
return meta.getString(elementKey);
|
}
|
|
public String getAccessToken() {
|
return null;
|
}
|
}
|