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> 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> 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();
|
}
|
|
}
|