package foundation.icall.callout; import java.util.concurrent.TimeUnit; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.action.ActionContext; import foundation.dao.bizlogic.IRequest; import foundation.dao.bizlogic.ResponseType; import foundation.icall.ICall; import foundation.icall.ICallDirection; import foundation.server.ObjectCreator; import okhttp3.OkHttpClient; import okhttp3.OkHttpClient.Builder; import okhttp3.Request; import okhttp3.Response; public abstract class HttpServerSource implements IRemoteSource { public static boolean Test = false; 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(HttpServerSource.class); } protected HttpServerSource() { 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 HttpServerSource newInstance(HttpServerMeta meta) throws Exception { String className = meta.getClassName(); HttpServerSource instance = ObjectCreator.create(className); instance.init(meta); return instance; } public abstract void login(ActionContext context, ICall iCall) throws Exception; public abstract void logout(ActionContext context, ICall iCall) throws Exception; public abstract ICallRequest createRequest(String url); @SuppressWarnings("unchecked") public T post(IRequest request, ResponseType responseType) throws Exception { //1. 如果测试状态,直接退出 if (Test) { 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(); //3. 将 URL 设置到请求中 String params = iRequest.paramsToURL(); builder.url(iRequest.getURL() + params); //4. 将 headers 设置到请求中 if (iRequest.existsHeaders()) { iRequest.applyHeaders(builder); } //5. 将 JSON Body 设置到请求中 if (iRequest.existsJSONBody()) { iRequest.applyJSONBody(builder); } //6. 将 Form Body 设置到请求中 if (iRequest.existsFormBody()) { iRequest.applyFormBody(builder); } //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; } @SuppressWarnings("unchecked") public T get(IRequest request, ResponseType responseType) throws Exception { ICallRequest iRequest = (ICallRequest)request; T result = null; Request.Builder builder = new Request.Builder().get(); //1. 将 URL 设置到请求中 String params = iRequest.paramsToURL(); builder.url(iRequest.getURL() + params); //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; } @Override public Object get() { return this; } public ICallDirection getDirection() { return ICallDirection.RemoteServer; } public HttpServerMeta getMeta() { return meta; } @Override public String getName() { return meta.getName(); } }