Java - 在WebService中使用Client調用三方的RestAPI
背景
近期,由於項目的要求需要在自己的webservice中調用遠程的WebAPI(Restful format)。自己的webservice程序是用Java編碼寫的,所以需要在其中實現一個Client來調用遠程的Restful介面。
選型
其實在自己的項目裡面也有類似的調用,當時使用的是「JAXRSClientFactory」獲得靜態代理client。 由於這種方式需要依賴於遠程調用的webservice介面(需要引入別人的jar包)。這就造成了高耦合。因此不適用。
所以需要以一種低耦合的方式來實現。便有了選型的想法。
在網上搜索一番後,基本定型為兩種方式:
1.HttpClient
2.RestTemplate
接下來就分別列出兩種方式的實現代碼
HttpClient
import java.io.IOException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpClientUtil {
private static final Logger log = LoggerFactory.getLogger(HttpClientUtil.class);
private CloseableHttpClient httpClient = HttpClients.createDefault;
public static String executePost(String url, String tdfBase64) throws Exception {
String result = null;
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new HttpEntity
HttpResponse response = httpClient.execute(httpPost);
if (response != null) {
HttpEntity resEntity = response.getEntity;
if (resEntity != null) {
result = EntityUtils.toString(resEntity, "utf-8");
}
}
return result;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "http://169.8.160.201:8080/xx/Webservice/Submit";
String base64Tdf = "MS4wMToxMzIdMS4wMjowMjAxHTEuMDM6MR8wMR4yHzAwHTEuMDQ6SVJRHTEuMDU6MjAxNjA1MDQdMS4wNjoxHTEuMDc6Q09HRU5UHTEuMDg6VEhBSUxBTkQdMS4wOTpTRVFVRU5DRU5PMTIzNB0xLjExOjE5LjY5HTEuMTI6MTkuNjkcMi4wMDE6MzEdMi4wMDI6MDAdMi4xNzY6MDA3MDA5HA==";
HttpClientUtil client = new HttpClientUtil;
String result=client.executePost(url, base64Tdf, "");
System.out.println(result);
}
RestTemplate
package com.biolive.client;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
public class RestTemplateClient {
private static final Logger log = LoggerFactory.getLogger(RestTemplateClient.class);
private static final int connectTimeout= 5000;
private static final int readTimeOut=5000;
private RestTemplate restTemplate;
public RestTemplateClient{
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory;
requestFactory.setConnectTimeout(connectTimeout);
requestFactory.setReadTimeout(readTimeOut);
restTemplate = new RestTemplate(requestFactory);
}
public String executePost(String url, String base64Tdf){
String result = null;
HttpEntity
try{
result=restTemplate.postForObject(url, request, String.class);
}catch(RestClientException ex){
ex.printStackTrace;
log.info("call post interface error: " + ex.getMessage);
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String url = "http://169.8.160.201:8080/xx/Webservice/Submit";
String base64Tdf = "MS4wMToxMzIdMS4wMjowMjAxHTEuMDM6MR8wMR4yHzAwHTEuMDQ6SVJRHTEuMDU6MjAxNjA1MDQdMS4wNjoxHTEuMDc6Q09HRU5UHTEuMDg6VEhBSUxBTkQdMS4wOTpTRVFVRU5DRU5PMTIzNB0xLjExOjE5LjY5HTEuMTI6MTkuNjkcMi4wMDE6MzEdMi4wMDI6MDAdMi4xNzY6MDA3MDA5HA==";
RestTemplateClient client = new RestTemplateClient;
String result=client.executePost(url, base64Tdf);
System.out.println(result);
}
}
總結
首先,用兩種方法都可以在只知道url和方法類型(GET/POST/PUT/UPDATE)的情況下完成任務,調用的方式也非常類似。
RestTemplate是Spring官方封裝和推薦的client, 它優化了一些底層操作,使得我們可以更簡單的使用。此外,也可以根據自己的需要和Spring進行結合以及配置。
附錄
RestTemplate的使用
RestTemplate有兩個構造方法,分別是:
public RestTemplate {
/**
...初始化過程
*/
}
public RestTemplate(ClientHttpRequestFactory requestFactory) {
this;
setRequestFactory(requestFactory);
}
其中,第二個構造方法中可以傳入ClientHttpRequestFactory參數,第一個進行默認初始化,因為我們經常需要對請求超時進行設置並能夠對超時進行後續處理,而第一個構造方法,我們無法控制超時時間,第二個構造中的ClientHttpRequestFactory介面的實現類中存在timeout屬性,因此選用第二個構造方法。在spring配置文件中進行如下配置:
當然也可以直接使用:
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory;
requestFactory.setConnectTimeout(1000);
requestFactory.setReadTimeout(1000);
RestTemplate restTemplate = new RestTemplate(requestFactory);
注意:ClientHttpRequestFactory 介面有4個實現類,分別是:
- AbstractClientHttpRequestFactoryWrapper 用來裝配其他request factory的抽象類。
- CommonsClientHttpRequestFactory 允許用戶配置帶有認證和http連接池的httpclient,已廢棄,推薦用HttpComponentsClientHttpRequestFactory。
- HttpComponentsClientHttpRequestFactory 同2.
- SimpleClientHttpRequestFactory 介面的一個簡單實現,可配置proxy,connectTimeout,readTimeout等參數
參考
http://www.cnblogs.com/softidea/p/5977375.html
http://blog.csdn.net/zpf336/article/details/73480810
※我的第一篇博文:C++新手村的復活點-致敬經典-小遊戲走迷宮
※Spring 極速集成註解 redis 實錄
※ASP.NET Core Web 資源打包與壓縮
TAG:科技優家 |
※SpringCloud之服務提供與調用(Ribbon,Feign)
※Asp.Net Core使用SignalR進行服務間調用
※OpenCV調用TensorFlow是什麼意思
※C/C++ 使用 TensorFlow 預訓練好模型——間接調用 Python 實現
※jQuery UI 小部件(Widget)方法調用
※使用redis來調用iptables,封禁惡意IP
※c井動態調用WebService
※加入Transformer-XL,這個PyTorch包能調用各種NLP預訓練模型
※使用 python 調用 echart 畫圖
※necp_client_action系統調用中的堆溢出漏洞分析
※透過現象看原理:詳解 Spring 中 Bean 的 this 調用導致 AOP 失效的原因
※python訓練mask rcnn模型&&C++調用訓練好的模型——基於opencv4.0
※Android端Chrome 67發布:增強AR/VR體驗 新API可調用諸多感測器
※關於如何使用webpack命令行傳入變數,並通過process.env來調用
※dubbo+zipkin調用鏈監控
※聽說 Android 9.0 要禁用@Hide APIs 的調用,你怎麼看?
※python調用api介面
※Python3 API 的封裝及調用
※如何用Ptrace攔截並模擬Linux系統調用
※Python 調用 Micro 宏自動解析 Nmon 文件進行數據歸檔