restFul風格呼叫get、post請求(包含檔案上傳與下載)
阿新 • • 發佈:2020-12-19
httpUtil使用說明
0,引用包
package com.activeclub.utils; import com.activeclub.bean.dto.RequestDto; import com.activeclub.bean.entity.KeyValue; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.TrustStrategy; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.net.ssl.SSLContext; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URI; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.List;
1,get請求呼叫
/** * get請求 * * @param requestDto 輸入引數 * @param servletResponse 反饋響應(用於檔案下載) * @return 文字輸出 */ public static String doGet(RequestDto requestDto, HttpServletResponse servletResponse) { String url = requestDto.getUrl();//請求的url路徑 String jsonStr = requestDto.getJsonStr();//請求的json輸入 List<KeyValue> params = requestDto.getParams();//請求的引數輸入 List<KeyValue> headers = requestDto.getHeaders();//header引數 Boolean hasServletResponse = requestDto.getHasServletResponse();//反饋響應 // 中間變數 String resultString = ""; CloseableHttpClient httpclient = null; CloseableHttpResponse response = null; InputStream is = null; OutputStream os = null; try { // 1 判斷url的型別 if (url.startsWith("https")) { httpclient = getIgnoeSSLClient(); } else { httpclient = HttpClients.createDefault(); } // 2 建立uri URIBuilder builder = new URIBuilder(url); if (params != null) { for (KeyValue kv : params) { builder.addParameter(kv.getKey(), kv.getValue().toString()); } } URI uri = builder.build(); // 3 建立http GET請求 並且 設定token HttpGet httpGet = new HttpGet(uri); if (headers != null) { for (KeyValue kv : headers) { httpGet.setHeader(kv.getKey(), kv.getValue().toString()); } } // 4 執行請求 response = httpclient.execute(httpGet); // 5 直接進行轉換 if (hasServletResponse) {// 5.1 有檔案下載 for (Header header : response.getAllHeaders()) { servletResponse.addHeader(header.getName(), header.getValue()); } byte[] respStr = EntityUtils.toByteArray(response.getEntity()); is = new ByteArrayInputStream(respStr); os = servletResponse.getOutputStream(); byte[] buffer = new byte[1024 * 1024]; int count = 0; while ((count = is.read(buffer)) != -1) { os.write(buffer, 0, count); } os.flush(); } else {// 5.2 沒有有檔案下載 resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } if (url.startsWith("https")) { EntityUtils.consume(response.getEntity()); } } catch (Exception e) { e.printStackTrace(); } finally { // 關閉服務 if (response != null) { try { response.close(); } catch (IOException e) { logger.error("CloseableHttpResponse close happend a error! ", e); } } if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { logger.error("httpclient close happend a error! ", e); } } if (is != null) { try { is.close(); } catch (IOException e) { logger.error("InputStream close happend a error! ", e); } } if (os != null) { try { os.close(); } catch (IOException e) { logger.error("OutputStream close happend a error! ", e); } } } return resultString; }
2,post請求呼叫
/** * post請求 * * @param requestDto 輸入引數 * @param multipartFile 上傳檔案 * @param servletResponse 反饋響應(用於檔案下載) * @return 文字輸出 */ public static String doPost(RequestDto requestDto, MultipartFile multipartFile, HttpServletResponse servletResponse) { String url = requestDto.getUrl();//請求的url路徑 String jsonStr = requestDto.getJsonStr();//請求的json輸入 List<KeyValue> params = requestDto.getParams();//請求的引數輸入 List<KeyValue> headers = requestDto.getHeaders();//header引數 Boolean hasServletResponse = requestDto.getHasServletResponse();//反饋響應 // 中間變數 File localFile = null; CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; InputStream is = null; OutputStream os = null; String resultString = ""; try { // 1 建立Httpclient物件 if (url.startsWith("https")) { httpClient = getIgnoeSSLClient(); } else { httpClient = HttpClients.createDefault(); } // 2 建立uri URIBuilder builder = new URIBuilder(url); if (params != null) { for (KeyValue kv : params) { builder.addParameter(kv.getKey(), kv.getValue().toString()); } } URI uri = builder.build(); // 3 建立Http Post請求 HttpPost httpPost = new HttpPost(uri); if (headers != null) { for (KeyValue kv : headers) { httpPost.addHeader(kv.getKey(), kv.getValue().toString()); } } if (!StringUtils.isEmpty(jsonStr)) {// 設定jsonBody StringEntity entity = new StringEntity(jsonStr, ContentType.APPLICATION_JSON); httpPost.setEntity(entity); } // 4 建立請求內容[如果有檔案上傳] if (null != multipartFile) { localFile = multipartFileToFile(multipartFile);// 把檔案轉換成流物件FileBody FileBody fileBody = new FileBody(localFile); // 以瀏覽器相容模式執行,防止檔名亂碼。 MultipartEntityBuilder builder2 = MultipartEntityBuilder.create(); builder2.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder2.addPart("file", fileBody); HttpEntity entity = builder2.build(); httpPost.setEntity(entity); } // 5 執行http請求 response = httpClient.execute(httpPost); if (hasServletResponse) {// 5.1 有檔案下載 for (Header header : response.getAllHeaders()) { servletResponse.addHeader(header.getName(), header.getValue()); } byte[] respStr = EntityUtils.toByteArray(response.getEntity()); is = new ByteArrayInputStream(respStr); os = servletResponse.getOutputStream(); byte[] buffer = new byte[1024 * 1024]; int count = 0; while ((count = is.read(buffer)) != -1) { os.write(buffer, 0, count); } os.flush(); } else { resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } // https結束 if (url.startsWith("https")) { EntityUtils.consume(response.getEntity()); } } catch (Exception e) { e.printStackTrace(); } finally { // 關閉服務 if (response != null) { try { response.close(); } catch (IOException e) { logger.error("response close happend a error! ", e); } } if (httpClient != null) { try { httpClient.close(); } catch (IOException e) { logger.error("httpClient close happend a error! ", e); } } if (localFile != null) { try { localFile.delete(); } catch (Exception e) { logger.error("localFile close happend a error! ", e); } } if (is != null) { try { is.close(); } catch (IOException e) { logger.error("inputStream close happend a error! ", e); } } if (os != null) { try { os.close(); } catch (IOException e) { logger.error("outputStream close happend a error! ", e); } } } return resultString; }
3,輔助函式
// https 操作
private static CloseableHttpClient getIgnoeSSLClient() throws Exception {
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
}).build();
CloseableHttpClient client = HttpClients.custom().setSSLContext(sslContext).
setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
return client;
}
// MultipartFile 轉換成為File (需要手動刪除delete)
private static File multipartFileToFile(MultipartFile multiFile) {
// 獲取檔名
String fileName = multiFile.getOriginalFilename();
try {
String path = System.getProperty("user.dir");
fileName = URLDecoder.decode(fileName, "utf-8");
fileName = URLEncoder.encode(fileName, "utf-8");
File file = new File(path + "\\" + fileName);
file.createNewFile();
multiFile.transferTo(file);
return file;
} catch (Exception e) {
logger.error("file transfer error:", e);
}
return null;
}
4,測試main函式
public static void main(String[] args) {
/**
*1,無入參的get請求(成功)
*/
RequestDto requestDto = new RequestDto();
requestDto.setUrl("https://a1.cnblogs.com/group/B1");
String result1 = doGet(requestDto, null);
System.out.println(result1);
System.out.println("--------------------------");
/**
*2,有入參的get請求(成功)
*/
RequestDto requestDto2 = new RequestDto();
requestDto2.setUrl("https://www.cnblogs.com/ajax/wechatshare/getconfig");
requestDto2.addParam("url","https%3A%2F%2Fwww.cnblogs.com%2F&file");
String result2 = doGet(requestDto2, null);
System.out.println(result2);
System.out.println("--------------------------");
/**
*3,無入參的post請求
*/
RequestDto requestDto3 = new RequestDto();
requestDto3.setUrl("https://www.cnblogs.com/aggsite/editorpickstat");
String result3 = doPost(requestDto3, null,null);
System.out.println(result3);
System.out.println("--------------------------");
/**
*4,有json引數的post請求
*/
RequestDto requestDto4 = new RequestDto();
requestDto4.setUrl("https://recomm.cnblogs.com/api/v2/recomm/blogpost/reco");
requestDto4.setJsonStr("{\"itemId\":11420047,\"itemTitle\":\"\\n 知識點複習統計\\n \\n\\n\\n\"}");
String result4 = doPost(requestDto4, null,null);
System.out.println(result4);
System.out.println("--------------------------");
}
5,其他
可直接訪問github https://github.com/mufasa007/repository
其中的app-framework-utils裡面的HttpUtil函式