1. 程式人生 > 實用技巧 >restFul風格呼叫get、post請求(包含檔案上傳與下載)

restFul風格呼叫get、post請求(包含檔案上傳與下載)

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函式