本篇文章已受權微信公衆號 guolin_blog (郭霖)獨家發佈
原文連接:模擬服務器返回數據java
模擬服務器返回的數據,在如下場景具備實際意義:android
和服務器開發協商好開發接口,但服務器API還沒有部署,想接口定義好就進行開發;
服務器已部署,返回的數據不能測試到各類狀況,但願返回期待數據測試邊界狀況;ios
若是客戶端開發人員能不走服務器,經過模擬數據返回,能提高開發效率和程序質量。git
本文主要講解兩種實現方式:github
使用網絡分析工具攔截客戶端請求,並返回僞造數據。
優勢:無需改變客戶端代碼;不依賴客戶端平臺,android和ios都通用;
缺點:依賴網絡分析工具;調試相對不靈活;json
使用客戶端網絡框架攔截請求並返回。
優勢:返回數據由客戶端代碼決定,靈活易於調試;
缺點:須要改變客戶端代碼;須要根據客戶端網絡框架進行響應處理,不一樣的網絡框架處理不同;api
對於方案一,主要使用網絡分析工具Charles進行攔截並返回,對於方案二,主要講解使用OkHttp做爲網絡框架,利用攔截器機制實現模擬返回。服務器
配置方法參考Charles:移動端設備網絡抓包
完成配置後,能夠在Charles中檢測到手機的網絡請求和響應。微信
以上,使用Mocky網絡和Charles工具實現模擬數據返回,無需改變客戶端原有代碼,可是,當須要改變客戶端返回的數據時,則須要從新生成http模擬地址,再次設置Charles Map to內容。網絡
如下內容假設用戶掌握OkHttp的簡單使用,重點講解自定義OkHttpInterceptor模擬返回數據。
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