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