Skip to content

Instantly share code, notes, and snippets.

@lidaling
Last active July 6, 2021 22:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lidaling/e76cf074cca7c03f53f86ca22fadaa86 to your computer and use it in GitHub Desktop.
Save lidaling/e76cf074cca7c03f53f86ca22fadaa86 to your computer and use it in GitHub Desktop.
httpclient 转发
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<String ,String> headerMap = getHeadersInfo(request, null);
for(Map.Entry<String, String> 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;
}
/**
* 根据GET方式请求获取请求内容
* @param url
* @return
*/
private String getContentFromUrlByGet(String url) {
String content = "";
try {
HttpClient client = new HttpClient();
GetMethod getMethod = new GetMethod(url);
client.executeMethod(getMethod);
InputStream stream = getMethod.getResponseBodyAsStream();
int length;
byte[] buffer = new byte[1024 * 4];
StringBuffer stringBuffer = new StringBuffer();
while ((length = stream.read(buffer)) != -1) {
stringBuffer.append(new String(buffer, 0, length, "utf-8"));
}
content = new String(stringBuffer);
getMethod.releaseConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
/**
* 根据POST请求获取请求内容
* @param url
* @return
*/
private String getContentFromUrlByPost(String url) {
String content = "";
try {
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(url);
// 增加变量
postMethod.addParameter("name", "name");
postMethod.addParameter("pwd", "pwd");
client.executeMethod(postMethod);
InputStream stream = postMethod.getResponseBodyAsStream();
int length;
byte[] buffer = new byte[1024 * 4];
StringBuffer stringBuffer = new StringBuffer();
while ((length = stream.read(buffer)) != -1) {
stringBuffer.append(new String(buffer, 0, length, "utf-8"));
}
content = new String(stringBuffer);
postMethod.releaseConnection();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
* 文件访问中转
* @param url 地址
* @param resp 响应
*/
public void relay(String url, HttpServletResponse resp){
if(url==null || "".equals(url.trim())){
return; // url为空时不处理
}
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
CloseableHttpResponse response = null;
System.out.println("要转发的文件地址:"+url);
try {
response = httpClient.execute(new HttpGet(url));
HttpEntity entity = response.getEntity();
int status = response.getStatusLine().getStatusCode();
resp.setStatus(status);
if (status==200 && entity!=null) {
//Content-Type根据文件实际类型设置
resp.setHeader("Content-Type", "application/pdf;charset=utf-8");
resp.setHeader("Content-Length", entity.getContentLength()+"");
resp.setHeader("Content-Encoding", "UTF-8");
InputStream is = entity.getContent();
OutputStream os = resp.getOutputStream();
byte[] buffer = new byte[1024];
int ch;
while ((ch = is.read(buffer)) != -1) {
os.write(buffer, 0, ch);
}
is.close();
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment