专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
郭霖  ·  Android Studio 中的 ... ·  4 天前  
郭霖  ·  一文了解 Gradle 的文件api ·  1 周前  
郭霖  ·  音视频基础能力之 Android ... ·  6 天前  
鸿洋  ·  掌握这17张图,掌握RecyclerView ... ·  6 天前  
51好读  ›  专栏  ›  郭霖

模拟服务器返回数据

郭霖  · 公众号  · android  · 2017-02-07 08:00

正文

今日科技快讯

美国总统特朗普为了提升国家安全,于上个月签署行政令:禁止叙利亚、伊拉克、伊朗、苏丹、索马里、也门和利比亚7个穆斯林国家的公民在90天内进入美国。但在近日,包括苹果、谷歌、微软、Facebook和Twitter在内的97家美国科技公司向美国法院提交了诉讼陈情摘要,表达了对该禁令的反对立场,因为他们需要招揽全球范围内的优秀人才。

作者简介

本篇来自 NEXTB 的投稿,介绍了两种模拟服务器返回数据的方法,希望能帮助到有需要的朋友。

NEXTB 的博客地址:

https://yuanjunli.github.io

背景

模拟服务器返回的数据,在以下场景具有实际意义:

和服务器开发协商好开发接口,但服务器API尚未部署,想接口定义好就进行开发;

服务器已部署,返回的数据不能测试到各种情况,希望返回期待数据测试边界情况;

如果客户端开发人员能不走服务器,通过模拟数据返回,能提升开发效率和程序质量。

实现思路

本文主要讲解两种实现方式:

1. 使用网络分析工具拦截客户端请求,并返回伪造数据。

优点:无需改变客户端代码;不依赖客户端平台,android和ios都通用;

缺点:依赖网络分析工具;调试相对不灵活;

2. 使用客户端网络框架拦截请求并返回。

优点:返回数据由客户端代码决定,灵活易于调试;

缺点:需要改变客户端代码;需要根据客户端网络框架进行响应处理,不同的网络框架处理不一样;

对于 方案一,主要使用网络分析工具 Charles 进行拦截并返回,对于 方案二,主要讲解使用OkHttp作为网络框架,利用拦截器机制实现模拟返回。

使用Charles模拟数据

准备条件

  • 客户端需要连接到和电脑同一个网络(手机连接电脑发出的wifi)

  • 官网下载安装:

    https://www.charlesproxy.com/download

配置

配置方法参考:

Charles:移动端设备网络抓包

http://shinelw.com/2016/04/21/about-charles

完成配置后,可以在Charles中检测到手机的网络请求和响应。

转接服务器地址

转接服务器地址是指,当客户端请求 地址B 时,本应该向指定的服务器请求数据,但 Charles 可拦截此ip地址,使不向服务器地址请求,并且返回另外一台服务器模拟的数据。

首先,我们来生成模拟返回数据的api接口;

打开mocky网址:

http://www.mocky.io

输入想伪造Body数据,点击 Generate my HTTP Response 按钮生成 http 的 url地址。

如图,当点击 http://www.mocky.io/v2/58592298240000ba087c5a92 时,返回json格式的数据。

有了模拟数据的api地址,接着设置需要模拟的api接口。经过配置后,Charles 可检测手机的网络请求,选择需要模拟返回数据的网络请求接口,右键 选择 Map Remote…

Map From 为需要拦截的接口,Map To 为模拟的api接口,此处我们填入 http://www.mocky.io/v2/58592298240000ba087c5a92,如下图:

选择标题栏 Tool工具图标,取消选择 Map Remote,再勾选 Map Remote,让设置的ip地址生效。此时,当客户端请求原地址时,都会返回模拟ip地址的数据,效果图如下:

小结

以上,使用 Mocky 网络和 Charles 工具实现模拟数据返回,无需改变客户端原有代码,但是,当需要改变客户端返回的数据时,则需要重新生成http模拟地址,再次设置 Charles Map to 内容。

自定义OkHttp Interceptor

以下内容假设用户掌握 OkHttp 的简单使用,重点讲解自定义 OkHttp Interceptor 模拟返回数据。

OkHttp拦截器

如图,OkHttp 可在 Request 和 Response 中设置任意个数的 Intercepor(图中用圆圈标识),对请求体和响应体进行处理。借助 OkHttp Interceptor 机制,创建一个 MockIntercepor,模拟返回一个 Response,虚线部分为模拟的 Response。

代码实现

MockInterceptor 代码如下:

在 debug模式 下,将此 Interceptor 添加到网络请求的 OkHttp 中,即可对指定的api地址进行拦截,并且返回特定的数据。

小结

使用 OkHttp 的拦截机制,可实现改变部分代码则可模拟返回数据,返回的数据可在代码中设置,可使用工厂模式将模拟数据的生成变动代码放到Factory中。依赖网络请求框架,若原项目使用 OkHttp 或 Retrofit 作为网络框架,可轻易实现模拟接口。

引用

Charles:移动端设备网络抓包

http://shinelw.com/2016/04/21/about-charles

利用charles模拟Http请求和响应

http://blog.csdn.net/guijiaoba/article/details/43198503

Hack Retrofit (2) 之 Mock Server

http://www.println.net/post/Android-Hack-Retrofit-Mock-Server

OkHttp Interceptor

https://github.com/square/okhttp/wiki/Interceptors

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: