
ars.invoke.channel.http.AbstractHttpInvoker Maven / Gradle / Ivy
The newest version!
package ars.invoke.channel.http;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import ars.invoke.Invoker;
import ars.invoke.Resource;
import ars.invoke.remote.Node;
import ars.invoke.remote.Protocol;
import ars.invoke.remote.Endpoint;
import ars.invoke.request.Requester;
/**
* Http远程调用抽象实现
*
* @author wuyongqiang
*/
public abstract class AbstractHttpInvoker implements Invoker {
/**
* 接收响应结果
*
* @param requester 请求对象
* @param endpoint 远程端点
* @param response Http响应对象
* @return 响应结果
* @throws Exception 操作异常
*/
protected abstract Object accept(Requester requester, Endpoint endpoint, HttpResponse response) throws Exception;
@Override
public Object execute(Requester requester, Resource resource) throws Exception {
Endpoint endpoint = (Endpoint) resource;
String uri = endpoint.getUri();
Node[] nodes = endpoint.getNodes();
for (int i = 0; i < nodes.length; i++) {
Node node = nodes[i];
String url = Https.getUrl(node, uri == null ? requester.getUri() : uri);
HttpUriRequest uriRequest = Https.getHttpUriRequest(url, Https.Method.POST, requester.getParameters());
if (requester instanceof HttpRequester) {
HttpServletRequest servletRequest = ((HttpRequester) requester).getHttpServletRequest();
Enumeration headers = servletRequest.getHeaderNames();
while (headers.hasMoreElements()) {
String header = headers.nextElement();
uriRequest.setHeader(header, servletRequest.getHeader(header));
}
}
uriRequest.addHeader(Https.CONTEXT_TOKEN, requester.getToken().getCode());
HttpClient client = Https.getClient(node.getProtocol() == Protocol.https);
try {
return this.accept(requester, endpoint, client.execute(uriRequest));
} catch (Exception e) {
if (i == nodes.length - 1) {
throw e;
}
} finally {
uriRequest.abort();
}
}
return null;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy