package com.walker.connector.support;
import com.walker.api.client.JsonTransfer;
import com.walker.api.client.MapTransfer;
import com.walker.api.client.RequestData;
import com.walker.api.client.ResponseData;
import com.walker.connector.AbstractConnector;
import com.walker.remote.AbstractByteCoder;
import com.walker.remote.Constants;
import com.walker.remote.DoubleTrust;
import com.walker.remote.RemoteAccessor;
import com.walker.remote.util.HttpUtils;
import org.apache.hc.client5.http.cookie.CookieStore;
import java.util.Map;
/**
* 移植旧代码。
*
* 支持 http 方式调用远程服务的连接器实现。
* 该对象在中小型项目中可以方便使用,但在大型分布式项目中不要使用(请使用 openFeign)
* @author 时克英
* @date 2022-09-09
*/
public class HttpConnector extends AbstractConnector {
private RemoteAccessor remoteAccessor = null;
// 设置客户端证书验证信息
private DoubleTrust clientTrust;
public DoubleTrust getClientTrust() {
return clientTrust;
}
public void setClientTrust(DoubleTrust clientTrust) {
this.clientTrust = clientTrust;
}
@Override
public Object invoke(Object... param) throws Exception {
if(param.length < 2){
throw new IllegalArgumentException("http调用参数缺失,至少2个:request, responseData");
}
if(param.length == 3){
this.requestRemoteTextWithCookie(remoteAccessor
, (RequestData)param[0]
, (ResponseData>)param[1]
, (CookieStore)param[2]);
} else {
this.requestRemoteText(remoteAccessor, (RequestData)param[0], (ResponseData>)param[1]);
}
return null;
}
@Override
public void initialize() {
super.initialize();
if(remoteAccessor == null){
remoteAccessor = this.getNewRemoteAccessor(getUrl());
}
}
@Override
public void destroy() {
if(remoteAccessor != null){
remoteAccessor = null;
}
}
/**
* 返回一个新的远程调用对象
* @param remoteURL 访问地址
* @param contentCoder 编码、解码器,可以为null
* @return
*/
protected RemoteAccessor getNewRemoteAccessor(String remoteURL, AbstractByteCoder contentCoder){
return HttpUtils.getInstance().getNewRemoteAccessor(remoteURL, contentCoder, clientTrust);
}
/**
* 返回一个新的远程调用对象
* @param remoteURL 访问地址
* @return
*/
protected RemoteAccessor getNewRemoteAccessor(String remoteURL){
return HttpUtils.getInstance().getNewRemoteAccessor(remoteURL, null, clientTrust);
}
/**
* 异步请求远程服务,界面不阻塞。
* @param request 请求对象
// * @param taskCallback 用户界面回调实现
// * @param Context context 界面上下文对象
*/
public void requestRemoteText(RemoteAccessor remoteAccessor
, RequestData request, ResponseData responseData){
if(request == null){
throw new IllegalArgumentException();
}
Class> requestDataClazz = request.getClass();
if(MapTransfer.class.isAssignableFrom(requestDataClazz)){
// 如果是实现Map参数方式
MapTransfer mapTransfer = (MapTransfer)request;
doRequestRemoteText(remoteAccessor, request.getRequestMethod()
, mapTransfer.toMap(), null, responseData);
} else if(JsonTransfer.class.isAssignableFrom(requestDataClazz)){
// 实现的json传参方式
JsonTransfer jsonTransfer = (JsonTransfer)request;
doRequestRemoteText(remoteAccessor, request.getRequestMethod()
, null, jsonTransfer.toJsonString(), responseData);
}
}
/**
* 请求服务端文本消息
* @param methodName 方法名,服务端给定的调用方法名称,如:
* @param simpleData 提交的简单参数,如果存在只会处理该参数
* @param jsonParameter 发送给服务端的参数,json格式
*/
private void doRequestRemoteText(RemoteAccessor remoteAccessor, String methodName
, Map simpleData
, String jsonParameter, ResponseData responseData){
if(remoteAccessor == null){
throw new IllegalStateException("remoteAccessor is required. 请先调用initialize()方法");
}
remoteAccessor.requestTextSync(methodName, simpleData, jsonParameter, responseData);
// if(!responseData.getChannelStatus()){
// logger.warn("请求返回错误状态: " + responseData.getChannelMessage());
// }
}
public void requestRemoteTextWithCookie(RemoteAccessor remoteAccessor
, RequestData request, ResponseData responseData
, CookieStore cookieStore){
if(request == null){
throw new IllegalArgumentException();
}
Class> requestDataClazz = request.getClass();
if(MapTransfer.class.isAssignableFrom(requestDataClazz)){
// 如果是实现Map参数方式
MapTransfer mapTransfer = (MapTransfer)request;
doRequestRemoteTextWithCookie(remoteAccessor, request.getRequestMethod()
, mapTransfer.toMap(), null, responseData, cookieStore);
} else if(JsonTransfer.class.isAssignableFrom(requestDataClazz)){
// 实现的json传参方式
JsonTransfer jsonTransfer = (JsonTransfer)request;
doRequestRemoteTextWithCookie(remoteAccessor, request.getRequestMethod()
, null, jsonTransfer.toJsonString(), responseData, cookieStore);
}
}
private void doRequestRemoteTextWithCookie(RemoteAccessor remoteAccessor, String methodName
, Map simpleData
, String jsonParameter, ResponseData responseData
, CookieStore cookieStore){
if(remoteAccessor == null){
throw new IllegalStateException("remoteAccessor is required. 请先调用initialize()方法");
}
remoteAccessor.requestTextSyncWithCookie(methodName, simpleData
, jsonParameter, responseData, cookieStore);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 新添加方法,2020-07-06
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public void requestGet(String methodName
, Map simpleData, Map header, ResponseData responseData){
this.checkRemoteAccessor();
remoteAccessor.requestSync(methodName, simpleData, null
, Constants.HTTP_METHOD_GET, Constants.APPLICATION_JSON, header, responseData);
}
public void requestPost(String methodName
, String jsonParameter, Map header, ResponseData responseData){
this.checkRemoteAccessor();
remoteAccessor.requestSyncPost(methodName, jsonParameter, header, responseData);
}
public void requestPut(String methodName
, String jsonParameter, Map header, ResponseData responseData){
this.checkRemoteAccessor();
remoteAccessor.requestSyncPut(methodName, jsonParameter, header, responseData);
}
public void requestDelete(String methodName
, String jsonParameter, Map header, ResponseData responseData){
this.checkRemoteAccessor();
remoteAccessor.requestSyncDelete(methodName, jsonParameter, header, responseData);
}
private void checkRemoteAccessor(){
if(remoteAccessor == null){
throw new IllegalStateException("remoteAccessor is required. 请先调用initialize()方法");
}
}
public static void main(String[] args){
HttpConnector connector = new HttpConnector();
connector.setUrl("http://193.193.193.28:9200");
// connector.setPort(9200);
connector.initialize();
// get
// TextResponse response1 = new TextResponse();
// Map simpleData = new HashMap<>();
// simpleData.put("analyzer", "ik_smart");
// simpleData.put("text", "经核实,我司从未与腾讯公司或授权他人与腾讯公司就“老干妈”品牌签署《联合市场推广合作协议》");
// connector.requestGet("/_analyze", simpleData, null, response1);
// System.out.println(response1.getResultData());
// post
/*TextResponse response2 = new TextResponse();
JSONObject postJson = new JSONObject();
postJson.put("analyzer", "ik_smart");
postJson.put("text", "经核实,我司从未与腾讯公司或授权他人与腾讯公司就“老干妈”品牌签署《联合市场推广合作协议》");
connector.requestPost("/_analyze", postJson.toJSONString(), null, response2);
System.out.println("2: post");
System.out.println(response2.getResultData());
// put
long startTime = System.nanoTime();
TextResponse response3 = new TextResponse();
String jsonStr = "{\"query\":{\"multi_match\": {\"query\":\"免疫力 识别\",\"fields\":[ \"title\", \"attachment.content\" ]}}}";
connector.requestPost("/demo/book/_search?pretty=true", jsonStr, null, response3);
System.out.println("3: post(search): " + (System.nanoTime() - startTime));
System.out.println(response2.getResultData());*/
}
}