设置请求头:必须排除掉Content-Length,Content-Type等参数否则上传文件为null
private void transferRequestHeaders(HttpRequest httpRequest, HttpServletRequest servletRequest) {
Enumeration<String> headerNames = servletRequest.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
if (name.equalsIgnoreCase(HTTP.CONTENT_LEN)
|| name.equalsIgnoreCase(HTTP.TRANSFER_ENCODING)
|| name.equalsIgnoreCase(HTTP.CONTENT_TYPE)) {
continue;
}
String value = servletRequest.getHeader(name);
httpRequest.setHeader(name, value);
}
}
发送请求并接受返回结果:
private Object uploadRequest(HttpServletRequest servletRequest, String httpUrl, String para, InputStream inputStream, String fileName) {
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
RequestConfig config = RequestConfig.custom().setConnectTimeout(TIMEOUT * 1000).build();
httpClientBuilder.setDefaultRequestConfig(config);
httpClient = httpClientBuilder.build();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(Charset.forName("UTF-8"));
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式,否则后台接口接收到的文件名中文乱码?????.xlsx
builder.addBinaryBody(para, inputStream, ContentType.MULTIPART_FORM_DATA, fileName);
HttpEntity fileEntity = builder.build();
HttpPost httpPost = new HttpPost(httpUrl);
transferRequestHeaders(httpPost, servletRequest);
httpPost.setEntity(fileEntity);
httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
String responseBody = null;
if (entity != null) {
responseBody = EntityUtils.toString(entity, Charset.forName("UTF-8"));
//关闭流
EntityUtils.consumeQuietly(entity);
}
if(responseBody.startsWith("{")) {
return JSONObject.parseObject(responseBody);
}else if(responseBody.startsWith("[")) {
return JSONArray.parseArray(responseBody);
}else {
return responseBody;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
httpResponse.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}