程序员必会的远程调用的多种方式

通用工具类

@Component
public class RestUtil {
    @Autowired
	private LoadBalancerClient loadBalancer;
	@Autowired
	private RestTemplate restTemplate;
public ResponseFrame request(String serviceId, String url, Map<String, Object> params, String fallbackUri) {
		//String baseUrl = getRestUrl(serviceId, fallbackUri);
		String baseUrl = "http://" + serviceId;
		long begin = System.currentTimeMillis();
		String resResult = null;
		try {
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
			MultiValueMap<String, String> paramsMvm = new LinkedMultiValueMap<String, String>();
			Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Object> e = entryKeyIterator.next();
				String value = null;
				if(e.getValue() != null) {
					value = e.getValue().toString();
				}
				paramsMvm.add(e.getKey(), value);
			}
			HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(paramsMvm, headers);
			resResult = restTemplate.postForObject(baseUrl + url, requestEntity, String.class);
			//String result = FrameHttpUtil.post(baseUrl + url, params);
			ResponseFrame frame = FrameJsonUtil.toObject(resResult, ResponseFrame.class);
			return frame;
		} catch (Exception e) {
			ResponseFrame frame = new ResponseFrame(ResponseCode.SERVER_ERROR);
			Map<String, Object> body = new HashMap<String, Object>();
			body.put("requestParams", params);
			body.put("exceptionInfo", e.getMessage());
			frame.setBody(body);
			return frame;
		} finally {
			long end = System.currentTimeMillis();
			long time = end - begin;
			if(time > 2000) {
				//接口请求>2s,则发送优化信息
				String remark = "请求超时!";
				saveOptimizeLog(serviceId, url, params, begin, end, time, resResult, remark);
			}
		}
	}

public String requestGet(String serviceId, String url, Map<String, Object> params, Map<String, Object> headersMap) {
		//String baseUrl = getRestUrl(serviceId, fallbackUri);
		String baseUrl = "http://" + serviceId;
		long begin = System.currentTimeMillis();
		String resResult = null;
		try {
			url = baseUrl + url;
			if (params.size() > 0) {
				if (!url.contains("?")) {
					url += "?";
				} else {
					url += "&";
				}
			}
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			if (headersMap != null) {
				Iterator<Entry<String, Object>> entryKeyIterator = headersMap.entrySet().iterator();
				while (entryKeyIterator.hasNext()) {
					Entry<String, Object> e = entryKeyIterator.next();
					String value = null;
					if(e.getValue() != null) {
						value = e.getValue().toString();
						headers.add(e.getKey(), value);
					}
				}
			}
			Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Object> e = entryKeyIterator.next();
				String value = null;
				if(e.getValue() != null) {
					value = e.getValue().toString();
				}
				url += e.getKey() + "=" + value + "&";
			}
		    HttpEntity<String> entity = new HttpEntity<String>(null, headers);
		    ResponseEntity<String> result = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
		    resResult = result.getBody();
			return resResult;
		} catch (Exception e) {
			ResponseFrame frame = new ResponseFrame(ResponseCode.SERVER_ERROR);
			Map<String, Object> body = new HashMap<String, Object>();
			body.put("requestParams", params);
			body.put("exceptionInfo", e.getMessage());
			frame.setBody(body);
			return FrameJsonUtil.toString(frame);
		} finally {
			long end = System.currentTimeMillis();
			long time = end - begin;
			if(time > 2000) {
				//接口请求>2s,则发送优化信息
				String remark = "请求超时!";
				saveOptimizeLog(serviceId, url, params, begin, end, time, resResult, remark);
			}
		}
	}

public String requestJsonBody(String serviceId, String url, Map<String, Object> params, String fallbackUri, HttpMethod httpMethod) {
		String resResult = null;
		// 获取访问服务的前缀地址
		//String baseUrl = getRestUrl(serviceId, fallbackUri);
		String baseUrl = "http://" + serviceId;
		try {
			if (HttpMethod.GET == httpMethod) {
				resResult = restTemplate.getForObject(baseUrl + url, String.class);
			} else {
				HttpHeaders headers = new HttpHeaders();
				headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
				headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
				String paramString = FrameJsonUtil.toString(params);
				HttpEntity<String> requestEntity = new HttpEntity<String>(paramString, headers);
				resResult = restTemplate.postForObject(baseUrl + url, requestEntity, String.class);
			}
			return resResult;
		} catch (Exception e) {
			ResponseFrame frame = new ResponseFrame(ResponseCode.SERVER_ERROR);
			Map<String, Object> body = new HashMap<String, Object>();
			body.put("requestParams", params);
			body.put("exceptionInfo", e.getMessage());
			frame.setBody(body);
			e.printStackTrace();
			return null;
		}
	}
/**
	 * from data 发送请求
	 * @param serviceId
	 * @param url
	 * @param params
	 * @param responseClazz
	 * @param responsePageClazz
	 * @return
	 */
	public <T> MsClientResponse<T> requestMsClient(String serviceId, String url, Map<String, Object> params, Class<?> responseClazz, Class<?> responsePageClazz) {
		//long begin = System.currentTimeMillis();
		String resResult = null;
		// 获取访问服务的前缀地址
		String baseUrl = "http://" + serviceId;
		try {
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
			MultiValueMap<String, String> paramsMvm = new LinkedMultiValueMap<String, String>();
			Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Object> e = entryKeyIterator.next();
				String value = null;
				if(e.getValue() != null) {
					value = e.getValue().toString();
				}
				paramsMvm.add(e.getKey(), value);
			}
			HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(paramsMvm, headers);
			resResult = restTemplate.postForObject(baseUrl + url, requestEntity, String.class);
			MsClientResponse<T> frame = FrameJsonUtil.toObject(resResult, MsClientResponse.class);
			if (frame.getCode() == ResponseCode.SUCC.getCode() && responseClazz != null) {
				frame.convertBody(responseClazz, responsePageClazz);
			}
			
			return frame;
		} catch (Exception e) {
			MsClientResponse<T> frame = new MsClientResponse<>(ResponseCode.SERVER_ERROR);
			frame.setRequestParams(FrameJsonUtil.toString(params));
			frame.setExceptionInfo(e.getMessage());
			e.printStackTrace();
			return frame;
		} finally {
		}
	}

/**
	 * 发送请求
	 * @param serviceId
	 * @param url
	 * @param params
	 * @param responseClazz
	 * @param responsePageClazz
	 * @return
	 */
	public <T> MsClientResponse<T> requestMsClientJsonBody(String serviceId, String url, Map<String, Object> params, Class<?> responseClazz, Class<?> responsePageClazz) {
		//long begin = System.currentTimeMillis();
		String resResult = null;
		// 获取访问服务的前缀地址
		//String baseUrl = getRestUrl(serviceId, fallbackUri);
		//ServiceInstance instance = getServiceInstance(serviceId);
		String baseUrl = "http://" + serviceId;
		try {
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
			headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
			String paramString = FrameJsonUtil.toString(params);
			@SuppressWarnings({ "rawtypes", "unchecked" })
			HttpEntity requestEntity = new HttpEntity(paramString, headers);
			resResult = restTemplate.postForObject(baseUrl + url, requestEntity, String.class);
			MsClientResponse<T> frame = FrameJsonUtil.toObject(resResult, MsClientResponse.class);
			if (frame.getCode() == ResponseCode.SUCC.getCode() && responseClazz != null) {
				frame.convertBody(responseClazz);
			}
			/*if(ResponseCode.SUCC.getCode() != frame.getCode()) {
				String remark = "接口响应异常!";
				saveOptimizeLog(serviceId, url, params, begin, null, null, resResult, remark);
			}*/
			return frame;
		} catch (Exception e) {
			MsClientResponse<T> frame = new MsClientResponse<>(ResponseCode.SERVER_ERROR);
			frame.setRequestParams(FrameJsonUtil.toString(params));
			frame.setExceptionInfo(e.getMessage());
			e.printStackTrace();
			return frame;
		} finally {
		}
	}

/**
	 * 上传文件
	 * @param serviceId
	 * @param url
	 * @param file
	 * @param params
	 * @param responseClazz
	 * @return
	 */
	public <T> MsClientResponse<T> uploadMsClient(String serviceId, String url, File file, Map<String, Object> params, Class<?> responseClazz) {
		String baseUrl = "http://" + serviceId;
		try {
			//设置请求头
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
			headers.setContentType(MediaType.MULTIPART_FORM_DATA);
			//设置请求体,注意是LinkedMultiValueMap
			FileSystemResource fileSystemResource = new FileSystemResource(file);
			MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
			form.add("file", fileSystemResource);

			Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Object> e = entryKeyIterator.next();
				String value = null;
				if(e.getValue() != null) {
					value = e.getValue().toString();
				}
				form.add(e.getKey(), value);
			}

			//用HttpEntity封装整个请求报文
			HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
			String result = restTemplate.postForObject(baseUrl + url, files, String.class);
			MsClientResponse<T> frame = FrameJsonUtil.toObject(result, MsClientResponse.class);
			if (frame.getCode() == ResponseCode.SUCC.getCode() && responseClazz != null) {
				frame.convertBody(responseClazz);
			}
			return frame;
		} catch (Exception e) {
			MsClientResponse<T> frame = new MsClientResponse<>(ResponseCode.SERVER_ERROR);
			frame.setRequestParams(FrameJsonUtil.toString(params));
			frame.setExceptionInfo(e.getMessage());
			e.printStackTrace();
			return frame;
		} finally {
		}
	}
/**
	 * 下载文件
	 * @param serviceId
	 * @param url
	 * @param savePath
	 * @param params
	 * @return
	 */
	public ResponseEntity<byte[]> downloadMsClient(String serviceId, String url, Map<String, Object> params) {
		String baseUrl = "http://" + serviceId;
		try {
			HttpHeaders headers = new HttpHeaders();
			headers.add(BizLogData.MS_TRACE_ID, BizLogTraceIdUtil.getTraceId());
			List<MediaType> list = new ArrayList<MediaType>();
			// 指定下载文件类型
			list.add(MediaType.APPLICATION_OCTET_STREAM);
			headers.setAccept(list);

			// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
			MultiValueMap<String, String> paramsMvm = new LinkedMultiValueMap<String, String>();
			Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
			while (entryKeyIterator.hasNext()) {
				Entry<String, Object> e = entryKeyIterator.next();
				String value = null;
				if(e.getValue() != null) {
					value = e.getValue().toString();
				}
				paramsMvm.add(e.getKey(), value);
			}
			HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(paramsMvm, headers);
			ResponseEntity<byte[]> response = this.restTemplate.exchange(baseUrl + url, HttpMethod.POST, requestEntity, byte[].class);
			return response;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
		}
	}

2:http工具类

public class HttpUtils {
		private static final Logger LOGGER = LoggerFactory.getLogger(FrameHttpUtil.class);
	private static int HTTP_CONNECT_TIMEOUT = 5000;
	private static int HTTP_CONNECTION_REQUEST_TIMEOUT = 120000;
	private static int HTTP_SOCKET_TIMEOUT = 120000;
	
	public static void setTimeout(int httpConnectTimeout, int httpConnectionRequestTimeout, int httpSocketTimeout) {
		HTTP_CONNECT_TIMEOUT = httpConnectTimeout;
		HTTP_CONNECTION_REQUEST_TIMEOUT = httpConnectionRequestTimeout;
		HTTP_SOCKET_TIMEOUT = httpSocketTimeout;
	}
}

/**
	 * 创建支持http和https的请求
	 * @return
	 */
	private static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				//信任所有
				public boolean isTrusted(X509Certificate[] chain,
						String authType) throws CertificateException {
					return true;
				}
			}).build();
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return  HttpClients.createDefault();
	}
/**
	 * get方式请求
	 * @param url			请求地址
	 * @return
	 * @throws IOException 
	 */
	public static String get(String url) throws IOException {
		String result = null;
		// 创建默认的httpClient实例
		CloseableHttpClient httpClient = createSSLClientDefault();
		// 创建httppost
		HttpGet httpGet = new HttpGet(url);
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
				.setSocketTimeout(HTTP_SOCKET_TIMEOUT).build();
		httpGet.setConfig(requestConfig);
		// 创建参数队列
		//try {
		CloseableHttpResponse response = httpClient.execute(httpGet);
		try {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				result = EntityUtils.toString(entity, "UTF-8");
			}
		} finally {
			response.close();
			httpClient.close();
		}
		return result;
	}
/**
	 * post方式请求
	 * @param url			请求地址
	 * @param jsonBody	参数内容格式为: {"name":"xxxx"}
	 * @return
	 * @throws IOException 
	 */
	public static String post(String url, String jsonBody) throws IOException {
		String result = null;
		// 创建默认的httpClient实例
		CloseableHttpClient httpClient = createSSLClientDefault();
		// 创建httppost
		HttpPost httpPost = new HttpPost(url);
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
				.setSocketTimeout(HTTP_SOCKET_TIMEOUT).build();
		httpPost.setConfig(requestConfig);
		// 创建参数队列
		//try {
		StringEntity input = new StringEntity(jsonBody, "UTF-8");
		input.setContentType("application/json;charset=utf-8");
		httpPost.setEntity(input);
		CloseableHttpResponse response = httpClient.execute(httpPost);
		try {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				result = EntityUtils.toString(entity, "UTF-8");
			}
		} finally {
			response.close();
			httpClient.close();
		}
		
		return result;
	}
	
	/**
	 * post方式请求
	 * @param url			请求地址
	 * @param params		系统参数
	 * @return
	 * @throws IOException 
	 */
	public static String post(String url, Map<String, Object> params) throws IOException {
		String result = null;
		// 创建默认的httpClient实例.
		CloseableHttpClient httpClient = createSSLClientDefault();
		// 创建httppost
		HttpPost httpPost = new HttpPost(url);
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
				.setSocketTimeout(HTTP_SOCKET_TIMEOUT).build();
		httpPost.setConfig(requestConfig);
		// 创建参数队列 
		List<NameValuePair> formparams = new ArrayList<NameValuePair>();
		Iterator<Entry<String, Object>> entryKeyIterator = params.entrySet().iterator();
		while (entryKeyIterator.hasNext()) {
			Entry<String, Object> e = entryKeyIterator.next();
			String value = null;
			if(e.getValue() != null) {
				value = e.getValue().toString();
			}
			formparams.add(new BasicNameValuePair(e.getKey(), value));
		}
		UrlEncodedFormEntity uefEntity;
		/*try {*/
		uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
		httpPost.setEntity(uefEntity);
		CloseableHttpResponse response = httpClient.execute(httpPost);
		try {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				result = EntityUtils.toString(entity, "UTF-8");
			}
		} finally {
			response.close();
			httpClient.close();
		}
		return result;
	}
public static String download(String url, String savePath) {
		ResponseFrame frame = new ResponseFrame();
		InputStream inputStream = null;
		FileOutputStream fos = null;
		try {
			URL u = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) u.openConnection();
			//设置超时间为3秒
			conn.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
			//防止屏蔽程序抓取而返回403错误
			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

			//得到输入流
			inputStream = conn.getInputStream();
			//获取自己数组
			byte[] getData = readInputStream(inputStream);
			File file = new File(savePath);
			//文件保存位置
			FrameFileUtil.createDir(file);
			fos = new FileOutputStream(file);
			fos.write(getData);
		} catch (IOException e) {
			LOGGER.error(e.getMessage(), e);
			frame.setCode(-2);
			frame.setMessage(e.getMessage());
		} finally {
			try {
				if(fos != null) {
					fos.close();
				}
				if(inputStream != null){
					inputStream.close();
				}
			} catch (IOException e) {
			}
		}
		return savePath;
	}
	/**
	 * 从输入流中获取字节数组
	 * @param inputStream
	 * @return
	 * @throws IOException
	 */
	private static byte[] readInputStream(InputStream inputStream) throws IOException {
		byte[] buffer = new byte[1024];
		int len = 0;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		while((len = inputStream.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		bos.close();
		return bos.toByteArray();
	}

	/**
	 * delete方式请求
	 * @param url			请求地址
	 * @return
	 * @throws IOException 
	 */
	public static String delete(String url) throws IOException {
		String result = null;
		// 创建默认的httpClient实例.
		CloseableHttpClient httpClient = createSSLClientDefault();
		// 创建httppost
		HttpDelete httpDelete = new HttpDelete(url);
		RequestConfig requestConfig = RequestConfig.custom()
				.setConnectTimeout(HTTP_CONNECT_TIMEOUT).setConnectionRequestTimeout(HTTP_CONNECTION_REQUEST_TIMEOUT)
				.setSocketTimeout(HTTP_SOCKET_TIMEOUT).build();
		httpDelete.setConfig(requestConfig);
		// 创建参数队列 
		
		CloseableHttpResponse response = httpClient.execute(httpDelete);
		try {
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				result = EntityUtils.toString(entity, "UTF-8");
			}
		} finally {
			response.close();
			httpClient.close();
		}
		return result;
	}
	
	public static void main(String[] args) throws IOException {
		Map<String, String> params = new HashMap<String, String>();
		String str = post("", params);
		System.out.println(str);
	}

}

好了 至此程序员必会的远程调用的多种方式 学习结束了 友友们 点点关注不迷路 老铁们!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值