通用工具类
@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);
}
}
好了 至此程序员必会的远程调用的多种方式 学习结束了 友友们 点点关注不迷路 老铁们!!!!!