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