HttpClient遠程調用

遠程調用的說明

瀏覽器解析ajax發起跨域請求.程序雖然能夠正確的調用,可是瀏覽器能夠監控用戶的全部的參數及返回值.在一些特定的條件下該操做不安全.(例如:支付寶支付操做)
通常使用跨域的請求都是用來獲取其餘服務器的數據(查詢操做),若是遇到了POST須要提交的參數應該使用更加安全的請求方式實現.html

HttpClient介紹

HTTP 協議多是如今 Internet 上使用得最多、最重要的協議了,愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。HttpClient 已經應用在不少的項目中,好比 Apache Jakarta 上很著名的另外兩個開源項目 Cactus 和 HTMLUnit 都使用了 HttpClient。如今HttpClient最新版本爲 HttpClient 4.5 .6(2015-09-11)前端

以上是百度的概念java

總結來講就是:HttpClient是用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包web

HttpClient入門案例

導入jar包

<!--添加httpClient jar包 -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>

入門案例

public class TestHttpClient {
    /**
     * 步驟:
     *  1.實例化httpClient工具API
     *  2.定義請求url地址  任意網絡地址....
     *  3.定義請求的類型  get/post/put/delete
     *  4.發起請求,獲取響應的結果
     *  5.判斷響應的狀態碼信息.  200 404 500 406 400....
     *  6.動態解析返回值執行後續操做.
     */
    @Test
    public void test01(){
        HttpClient httpClient = HttpClients.createDefault();
        String url = "https://www.baidu.com/";
        HttpGet get = new HttpGet(url);
        try {
            HttpResponse httpResponse = httpClient.execute(get);
            //判斷狀態碼是否正確
            int statusCode = httpResponse.getStatusLine().getStatusCode();
            if(statusCode == 200){
                //表示請求正確
                HttpEntity httpEntity = httpResponse.getEntity(); //獲取服務器的所有響應信息(json/html/xml/xxxx)
                String result = EntityUtils.toString(httpEntity,"UTF-8");
                //獲取以後能夠執行業務處理......
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

HttpClient遠程調用實例說明

需求說明

需求:根據userId查詢用戶的信息.
1.用戶的url地址: http://www.xx.com/findUserById/7;
2.須要在xx-web的Controller中動態的接收數據.將請求轉給sso單點登陸系統;
url:http://sso.xx.com/findUserById/7
3.在jt-sso中的Controller根據userId查詢用戶信息.ajax

編輯前端 controller

前端controller接收客戶端http請求apache

/**
 * 爲了測試httpClient 實現業務功能查詢用戶信息
 * url地址:http://www.jt.com/user/findUserById/7
 * 參數:  7用戶ID
 * 返回值: user對象
 */
@RequestMapping("/findUserById/{userId}")
@ResponseBody
public User findUserById(@PathVariable Long userId){
    return userService.findUserById(userId);
}

編輯前端 service

在前端service中經過入門案例中的六步,進行遠程跨域調用後端編程

@Service
public class UserServiceImpl implements UserService{
    /**
     * 由xx-web向xx-sso進行數據的請求.以後獲取數據.
     * @param userId
     * @return
     */
    @Override
    public User findUserById(Long userId) {
        //1.定義url地址
        String url = "http://sso.xx.com/user/findUserById/"+userId;
        HttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse httpResponse = httpClient.execute(httpGet);
            if(httpResponse.getStatusLine().getStatusCode() == 200){
                HttpEntity httpEntity = httpResponse.getEntity();
                //json格式
                String result = EntityUtils.toString(httpEntity, "UTF-8");
                return ObjectMapperUtil.toObject(result, User.class);
            }else{
                throw new RuntimeException("請求失敗,請校驗地址信息");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

編輯後端 controller

後端controller接收httpclient發送的遠程調用請求json

/**
 * 測試httpClient調用方式
 * url地址: http://sso.jt.com/user/findUserById/"+userId
 * 返回:  user對象的JSON數據
 */
@RequestMapping("/findUserById/{userId}")
public User findUserById(@PathVariable Long userId){
    return userService.findUserById(userId);
}

編寫後端 service

實現後端 service查詢業務實現後端

@Override
public User findUserById(Long userId) {
    return userMapper.selectById(userId);
}

HttpClient遠程調用流程圖

image

相關文章
相關標籤/搜索