模擬服務器返回數據|掘金技術徵文

本篇文章已受權微信公衆號 guolin_blog (郭霖)獨家發佈
原文連接:模擬服務器返回數據java

背景

模擬服務器返回的數據,在如下場景具備實際意義:android

和服務器開發協商好開發接口,但服務器API還沒有部署,想接口定義好就進行開發;
服務器已部署,返回的數據不能測試到各類狀況,但願返回期待數據測試邊界狀況;ios

若是客戶端開發人員能不走服務器,經過模擬數據返回,能提高開發效率和程序質量。git

實現思路

本文主要講解兩種實現方式:github

  1. 使用網絡分析工具攔截客戶端請求,並返回僞造數據。
    優勢:無需改變客戶端代碼;不依賴客戶端平臺,android和ios都通用;
    缺點:依賴網絡分析工具;調試相對不靈活;json

  2. 使用客戶端網絡框架攔截請求並返回。
    優勢:返回數據由客戶端代碼決定,靈活易於調試;
    缺點:須要改變客戶端代碼;須要根據客戶端網絡框架進行響應處理,不一樣的網絡框架處理不同;api

對於方案一,主要使用網絡分析工具Charles進行攔截並返回,對於方案二,主要講解使用OkHttp做爲網絡框架,利用攔截器機制實現模擬返回。服務器

使用Charles模擬數據

準備條件

  1. 客戶端須要鏈接到和電腦同一個網絡(手機鏈接電腦發出的wifi)
  2. 官網下載安裝

配置

配置方法參考Charles:移動端設備網絡抓包
完成配置後,能夠在Charles中檢測到手機的網絡請求和響應。微信

轉接服務器地址

Charles 攔截原理

轉接服務器地址是指,當客戶端請求地址B時,本應該向指定的服務器請求數據,但Charles可攔截此ip地址,使不向服務器地址請求,而且返回另一臺服務器模擬的數據。
首先,咱們來生成模擬返回數據的api接口;
打開 mocky網址,輸入想僞造Body數據,點擊 Generate my HTTP Response按鈕生成http的url地址。
mocky生成模擬地址

如圖,當點擊 www.mocky.io/v2/58592298… 時,返回json格式的數據。
有了模擬數據的api地址,接着設置須要模擬的api接口。通過配置後,Charles可檢測手機的網絡請求,選擇須要模擬返回數據的網絡請求接口, 右鍵選擇 Map Remote...
Map From爲須要攔截的接口,Map To爲模擬的api接口,此處咱們填入 www.mocky.io/v2/58592298…,以下圖:
Charles 攔截ip地址

選擇標題欄 Tool工具圖標,取消選擇 Map Remote,再勾選 Map Remote,讓設置的ip地址生效。此時,當客戶端請求原地址時,都會返回模擬ip地址的數據,效果圖以下:
Charles 返回模擬數據

小結

以上,使用Mocky網絡和Charles工具實現模擬數據返回,無需改變客戶端原有代碼,可是,當須要改變客戶端返回的數據時,則須要從新生成http模擬地址,再次設置Charles Map to內容。網絡

自定義OkHttp Interceptor模擬返回

如下內容假設用戶掌握OkHttp的簡單使用,重點講解自定義OkHttpInterceptor模擬返回數據。

OkHttp攔截器

OkHttp 攔截器

如圖,OkHttp可在Request和Response中設置任意個數的Intercepor(圖中用圓圈標識),對請求體和響應體進行處理。藉助OkHttp Interceptor機制,建立一個MockIntercepor,模擬返回一個Response,虛線部分爲模擬的Response。

代碼實現

MockInterceptor代碼以下:

public class MockInterceptor implements Interceptor{
    @Override
    public Response intercept(Chain chain) throws IOException {
        Gson gson = new Gson();
        Response response = null;
        Response.Builder responseBuilder = new Response.Builder()
                .code(200)
                .message("")
                .request(chain.request())
                .protocol(Protocol.HTTP_1_0)
                .addHeader("content-type", "application/json");
        Request request = chain.request();
        if(request.url().equals("http://url_whitch_need_to_mock")) { //攔截指定地址
            String responseString = "{\n" +    //模擬數據返回body
                    "\t\"code\": 200,\n" +
                    "\t\"message\": \"success\",\n" +
                    "\t\"data\": {}\n" +
                    "}";
            responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), responseString.getBytes()));//將數據設置到body中
            response = responseBuilder.build(); //builder模式構建response
        }else{
            response = chain.proceed(request);
        }
        return response;
    }
}複製代碼

在debug模式下,將此Interceptor添加到網絡請求的OkHttp中,便可對指定的api地址進行攔截,而且返回特定的數據。

小結

使用OkHttp的攔截機制,可實現改變部分代碼則可模擬返回數據,返回的數據可在代碼中設置,可以使用工廠模式將模擬數據的生成變更代碼放到Factory中。依賴網絡請求框架,若原項目使用OkHttp或Retrofit做爲網絡框架,可輕易實現模擬接口。

引用

Charles:移動端設備網絡抓包
利用charles模擬Http請求和響應
Hack Retrofit (2) 之 Mock Server
OkHttp Interceptor

相關文章
相關標籤/搜索