喜欢小之的文章的能够关注公众号「WeaponZhi」持续关注动态php
做为移动开发工程师,平时开发阶段跟接口相关的工做都是要和服务端的小伙伴进行对接的,在对接的过程当中必定会有一些不太方便的地方。html
那么,今天我要给你们介绍一下「Charles」这款抓包软件,使用 Charles ,数据接口相关的接口和调试工做将变的高效、简单、痛快。java
我将具体介绍「查阅接口数据」、「接口数据替换」、「请求重定向」这三个功能在具体开发时候的使用姿式。程序员
这篇文章主要是介绍 Charles 在开发阶段的使用方式,突出实用性,至于 Charles 的介绍和配置,不是咱们本文的重点,还没配置的同窗能够参考这篇博文,很详细了:
Charles 使用心得ajax
咱们平时开发的时候,常常要调试接口,须要看一下接口返回的数据。大部分的时候,咱们是经过咱们本身配置的 Log 系统来进行查阅,这种方式虽然是能够能达到咱们的需求,但实际上仍是比较麻烦的,一些准备工做和操做也比较多,那么咱们如今拥有了 Charles,一切将变的简单粗暴,一目了然。浏览器
咱们配置好了以后,全部的浏览器请求都会在 Charles 中显示,若是你的手机和模拟器也配置好了代理,那么一样,模拟器和手机走的全部请求也会被列出来。host 闪过一下黄色标记,表示这个 host 下有一个新的请求刚刚走过。网络
图中左侧是 Charles 抓到的全部包的汇总,以请求的 host 为分类,右侧是这个请求具体的信息,包括请求头,返回的数据以及和这个请求相关的全部信息,若是数据是 JSON 格式,那么它会自动的格式化,若是是图片流,也会直接把图片显示出来等等,你想要有关这个接口的一切,都能一目了然。ide
不过有时候,咱们的请求有点太多了,咱们须要观察的就是一些特殊的 host 的请求。好比在这里,咱们但愿看到的就是「www.jianshu.com」这个 host 下的请求,那么咱们能够经过Proxy->Recording Settings
来设置过滤项,不过我通常会直接右击须要的 host 选中force
进行筛选,以下图所示:测试
咱们能够看到,这样其余的 host 都会被归类到Other Hosts
中了。spa
这样,咱们平时查阅接口信息就会变得简单粗暴了。
咱们平时在开发过程当中会常常遇到一些状况。好比你已经开始写请求的代码了,但服务端那边的接口还没写好,你的逻辑可能已经写完却没有办法去测试验证,你只能干等或者经过本身在代码中添加一些假数据来模拟请求,耗时耗力。
或者虽然你接口和服务端调通了,但你想作一些边界值的测试,想修改请求返回的值或者参数,这不是一件容易的事,每每须要服务端的配合,若是咱们能本身经过某种手段轻松的更改返回数据,岂不是一件可以帮助咱们提升代码容错率的美事?
Charles 能够很轻易的办到。
咱们如今用Retrofit
写一段简单的请求代码:
//举个栗子!
private void request(){
Api.getDefault(HostType.MESSAGE)//HOST:http://fy.iciba.com/
.getCall()
.subscribe(new BaseObserver<MessageBean>()){
@Override
protected void onSuccess(MessageBean entry) throws Exception{
entry.show();//请求成功展现数据
}
@Override
protected void onFailure(Throwable e, boolean isNetWorkError) throws Exception{
}
});
}复制代码
这里的getCall()
方法就是一个简单的get
请求,完整的请求地址为:http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Observable<MessageBean> getCall();复制代码
MessageBean
是这样的,咱们定义了一个show()
方法来打印出字段:
public class MessageBean {
public int status;
public content content;
public static class content {
public String from;
public String to;
public String out;
public String vendor;
public int errNo;
}
/** 定义 输出返回数据 的方法 */
public void show() {
LogUtils.i("status:" + status + "\n" +
"from:"+ content.from + "\n" +
"to:"+ content.to + "\n"+
"out:"+ content.out + "\n" +
"vendor:"+ content.vendor + "\n" +
"errNO:"+ content.errNo);
}
}复制代码
咱们进入应用,在 Charles 中看到的数据是这样的:
在应用中的日志显示是这样的:
这时候,咱们想修改下from
字段的值该怎么作呢?很简单。只需在Tools->Rewrite
中选择Enable Rewrite
,再 add 一个Rewrite Rule
,在里面填入你想替换的数据便可:
点击肯定,咱们从新请求一下,再看一下返回数据:
注意到了吗,返回的数据真正的被替换掉了,今后之后,咱们本身也能够轻易模拟数据了!不再用麻烦服务端的小伙伴了!
请求重定向是啥意思吧,咱们设想有这样一个现实的场景:
服务端的童鞋先把数据的格式定义好了,好比上面的MessageBean
具体的字段先给到咱们了,而后给了咱们一个测试地址和正式地址,但正式地址还没布好,咱们只能先用测试地址来写逻辑和测试。
咱们这个时候有了重定向,咱们能够在写逻辑的时候,把请求的地址依然用的是正式地址,但经过使用 Charles 的重定向功能,咱们在运行的时候,实际上走的请求是测试地址的请求,等到回头服务端的童鞋把正式环境布好的时候,咱们不须要特地去代码中更改请求地址,减小了修改可能形成的出错可能。
仍是举例上面的例子,咱们刚刚请求的地址,咱们也有日志打印出了它的实际请求地址和返回:
咱们如今把这个请求重定向到www.baidu.com
这个地址上,按理说若是重定向成功了,那么应该是返回百度首页 html 的页面代码数据,咱们实际操做下看看:
咱们将请求地址改为咱们设置的地址:
@GET("ajax.php")
Observable<MessageBean> getCall();复制代码
如今咱们从新运行一下,看一下请求日志:
咱们发现,一样的地址,返回结果已经不同了,返回的是百度首页的 html 代码了。
实际上平时用的最多的就是重定向本地文件了,使用刚刚那个选项下面的「Map Local」操做,和上面操做同样,只是在 Add 中添加一个本地的 JSON 文件,这样你在请求的时候直接就能返回本地文件的数据了,这样作的好处就是,你想改数据,只须要把本地文件修改保存,再次请求,数据就已经变化了,简直是太方便了。
Charles 还有很是多好用的功能有待你们本身去发掘,好比断点功能,重发请求功能。这里再说一个比较好用的功能,那就是模拟慢网的功能。对于咱们平时开发来讲,这个功能仍是很实用的,不少时候,一些 bug 都是在这样的一种特殊状况才能复现。
打开方式就是Proxy->Start Throttling
,同时经过Proxy->Throttling Settings
能够进行更细致的网络设置。
相信你们已经火烧眉毛的来使用 Charles 了,这款神器能够说是开发必备。固然,做为程序员,咱们更应该了解到软件产品产出的不易,但愿你们能够支持正版,尊重他人的劳动成果,从正规渠道进行购买哦。
个人公众号期待您的关注