Java 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函数

posted on 2020-12-19 16:51  周健康  阅读(2362)  评论(0编辑  收藏  举报

导航