1. 程式人生 > >服務間呼叫方法:HttpClient

服務間呼叫方法:HttpClient

      在公司涉及到這樣一個需求,要求一個工程呼叫另一個工程的介面,一開始還挺高興,自己做過dubbo的,這個應該不是問題,因為我們這個專案沒有使用Dubbo框架,所以得用另一種方法了。
      最一開始我想著將另一個工程打成jar包使用,後來覺得這種方法應該效率會很低,一個工程裡又放另一個工程。
      後來從周博大哥那裡知道使用HttpClient就可以。

HttpClient方法的使用

配置檔案

config.properties配置url資訊:

#countryData URI
doc.method=http:localhost:8080/nation_data_admin
doc.SelectNationDataList
.uri=/nationData/selectNationData

Controller資訊:

String url = ApplicationUtil.getValue("doc.method") 
                +ApplicationUtil.getValue("doc.SelectDataService.uri") + "?code=" + code;

result = MyHttpClient.getMethod("http://" + url);

      由於該方法是get請求,所需傳的引數應該是自行拼接,如果是post方式則不必拼接,具體看MyHttpClient類對post方法的定義:

public static String postMethod(String url,Map parameters)throws Exception{
        HttpPost post = null;
        CloseableHttpResponse response = null;
        try{
            post = new HttpPost(url);
            if(parameters!=null){
                List<NameValuePair> nvps = new ArrayList<NameValuePair>();
                Iterator it = parameters.entrySet().iterator();
                while
(it.hasNext()){ Map.Entry entry = (Map.Entry)it.next(); String key = (String)entry.getKey(); String value = (String)entry.getValue(); nvps.add(new BasicNameValuePair(key, value)); } post.setEntity(new UrlEncodedFormEntity(nvps,"utf-8")); } response = client.execute(post); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity); return result; }catch(Exception e){ e.printStackTrace(); }finally{ try{ response.close(); post.releaseConnection(); }catch(Exception e){ e.printStackTrace(); } } return null; }

      一開始我傳的引數是map,有{},在url中就會自動拼接,但是url是無法識別這個符號的,後來乾脆就改了引數的傳遞方式,改傳map為多個引數,本來這樣呼叫以為就可以成功了,結果報錯,查了查是因為在url中無法拼接protocol錯誤,原來是url前沒加http。
      期間還有個問題,就是如果傳的引數為null,就不用在url拼接,那麼就用到StingBuffer直接append了。具體用法:

StringBuffer sb = new StringBuffer();
        sb.append(ApplicationUtil.getValue("doc.method"));
        sb.append(ApplicationUtil.getValue("doc.SelectNationDataList.uri") + "?");

if(dataClassification != null && dataClassification.length()>0){
        sb.append("dataClassification=" + dataClassification + "&");

Dubbo

      對dubbo的認識停留在遠端呼叫,RPC。可是具體的原理還沒有系統學習過。這幾天剛好學習taotao,所以就下篇部落格小編會對dubbo總結一下吧,剛好和今天的httpClient呼應。

總結

      從專案中學到了很多東西,和之前學的dubbo聯絡起來,加深了對服務呼叫的認識。這介面調通多虧了很多小夥伴的幫助啊,多謝嘍!