httpclientはpostリクエストをストリームを介して新しいhttpサービスに転送する
2903 ワード
最近、会社はspring cloud gatewayを採用して以前のopenApiゲートウェイを再構築しました.アクセスの中台が多いので、彼らを新しいゲートウェイに変えることはできません.新しいゲートウェイはオンライン時に問題がないことを保証するために全面的なテストが必要です.古いゲートウェイの要求を新しいゲートウェイに転向する方法を書きました.
public boolean forward(HttpServletRequest request, HttpServletResponse response , String serviceName) throws IOException {
String[] serviceNames = forwardname.split(";");
String requestURI = request.getRequestURI();// URI
String queryParam=request.getQueryString();// url
String url= targetUrl + requestURI;
if(StringUtils.isNoneBlank(queryParam)) {
url = url + "?" + queryParam;
}
logger.info(serviceName + "=================== forward to " + url );
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url);
Map headerMap = getHeadersInfo(request, null);
for(Map.Entry entry : headerMap.entrySet()) {
httpPost.setHeader(entry.getKey(), entry.getValue());
}
InputStream inputstream = request.getInputStream(); // post ,
InputStreamEntity inputEntity = new InputStreamEntity(inputstream); // 、
httpPost.setEntity(inputEntity);
httpPost.removeHeaders("Content-Length");
CloseableHttpResponse threadResponse = httpclient.execute(httpPost);
Header[] headers = threadResponse.getAllHeaders();
String result = null;
StatusLine statusLine = threadResponse.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = threadResponse.getEntity();
threadResponse.getAllHeaders();
if (entity != null) {
result = EntityUtils.toString(entity, "UTF-8");
}
} else {
result = JSON.toJSONString(statusLine);
}
if(headers != null ) {
//response
for(Header header : headers) {
response.setHeader(header.getName(), header.getValue());
}
}
try {
logger.info("forward response headers ==============" + JSON.toJSONString(headers));
logger.info("forward response body ==============" + result);
//
PrintWriter writer = response.getWriter();
writer.print(result);
writer.flush();
writer.close();
} catch (Exception e) {
logger.error("Write body to response error, " + e.getMessage());
}
return false;
}