當前位置:
首頁 > 知識 > Java - 在WebService中使用Client調用三方的RestAPI

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(tdfBase64));

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;

HttpEntityrequest = new HttpEntity(base64Tdf);
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 文件進行數據歸檔