不求服务端,自己改接口!Charles抓包工具在Android/iOS开发中的应用

前言

作为移动开发工程师,平时开发阶段跟接口相关的工作都是要和服务端的小伙伴进行对接的,在对接的过程中一定会有一些不太方便的地方。

那么,今天我要给大家介绍一下「Charles」这款抓包软件,使用 Charles ,数据接口相关的接口和调试工作将变的高效、简单、痛快。

我将具体介绍「查阅接口数据」、「接口数据替换」、「请求重定向」这三个功能在具体开发时候的使用姿势。

这篇文章主要是介绍 Charles 在开发阶段的使用方式,突出实用性,至于 Charles 的介绍和配置,不是我们本文的重点,还没配置的同学可以参考这篇博文,很详细了:
Charles 使用心得

查阅接口数据

我们平时开发的时候,经常要调试接口,需要看一下接口返回的数据。大部分的时候,我们是通过我们自己配置的 Log 系统来进行查阅,这种方式虽然是可以能达到我们的需求,但实际上还是比较麻烦的,一些准备工作和操作也比较多,那么我们现在拥有了 Charles,一切将变的简单粗暴,一目了然。

我们配置好了之后,所有的浏览器请求都会在 Charles 中显示,如果你的手机和模拟器也配置好了代理,那么同样,模拟器和手机走的所有请求也会被列出来。host 闪过一下黄色标记,表示这个 host 下有一个新的请求刚刚走过。

Charles 整体界面

图中左侧是 Charles 抓到的所有包的汇总,以请求的 host 为分类,右侧是这个请求具体的信息,包括请求头,返回的数据以及和这个请求相关的所有信息,如果数据是 JSON 格式,那么它会自动的格式化,如果是图片流,也会直接把图片显示出来等等,你想要有关这个接口的一切,都能一目了然。

不过有时候,我们的请求有点太多了,我们需要观察的就是一些特殊的 host 的请求。比如在这里,我们希望看到的就是「www.jianshu.com」这个 host 下的请求,那么我们可以通过Proxy->Recording Settings来设置过滤项,不过我一般会直接右击需要的 host 选中force进行筛选,如下图所示:

Focus

我们可以看到,这样其他的 host 都会被归类到Other Hosts中了。

Other Hosts

这样,我们平时查阅接口信息就会变得简单粗暴了。

接口数据替换

我们平时在开发过程中会经常遇到一些情况。比如你已经开始写请求的代码了,但服务端那边的接口还没写好,你的逻辑可能已经写完却没有办法去测试验证,你只能干等或者通过自己在代码中添加一些假数据来模拟请求,耗时耗力。

或者虽然你接口和服务端调通了,但你想做一些边界值的测试,想修改请求返回的值或者参数,这不是一件容易的事,往往需要服务端的配合,如果我们能自己通过某种手段轻松的更改返回数据,岂不是一件能够帮助我们提高代码容错率的美事?

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 中看到的数据是这样的:

JSON 数据

在应用中的日志显示是这样的:

Log

这时候,我们想修改下from字段的值该怎么做呢?很简单。只需在Tools->Rewrite中选择Enable Rewrite,再 add 一个Rewrite Rule,在里面填入你想替换的数据即可:

替换数据

点击确定,我们重新请求一下,再看一下返回数据:

更改后的数据 Log

注意到了吗,返回的数据真正的被替换掉了,从此以后,我们自己也可以轻易模拟数据了!再也不用麻烦服务端的小伙伴了!

请求重定向

请求重定向是啥意思吧,我们设想有这样一个现实的场景:

服务端的童鞋先把数据的格式定义好了,比如上面的MessageBean具体的字段先给到我们了,然后给了我们一个测试地址和正式地址,但正式地址还没布好,我们只能先用测试地址来写逻辑和测试。

我们这个时候有了重定向,我们可以在写逻辑的时候,把请求的地址依然用的是正式地址,但通过使用 Charles 的重定向功能,我们在运行的时候,实际上走的请求是测试地址的请求,等到回头服务端的童鞋把正式环境布好的时候,我们不需要特意去代码中更改请求地址,减少了修改可能造成的出错可能。

还是举例上面的例子,我们刚刚请求的地址,我们也有日志打印出了它的实际请求地址和返回:

原来的 Response

我们现在把这个请求重定向到www.baidu.com这个地址上,按理说如果重定向成功了,那么应该是返回百度首页 html 的页面代码数据,我们实际操作下看看:

重定向操作

我们将请求地址改成我们设置的地址:

@GET("ajax.php")
Observable<MessageBean> getCall();

现在我们重新运行一下,看一下请求日志:

重定向后的 Response

我们发现,同样的地址,返回结果已经不一样了,返回的是百度首页的 html 代码了。

其他功能

Charles 还有非常多好用的功能有待大家自己去发掘,比如断点功能重发请求功能。这里再说一个比较好用的功能,那就是模拟慢网的功能。对于我们平时开发来说,这个功能还是很实用的,很多时候,一些 bug 都是在这样的一种特殊情况才能复现。

打开方式就是Proxy->Start Throttling,同时通过Proxy->Throttling Settings可以进行更细致的网络设置。

模拟慢网

总结

相信大家已经迫不及待的来使用 Charles 了,这款神器可以说是开发必备。当然,作为程序员,我们更应该了解到软件产品产出的不易,希望大家可以支持正版,尊重他人的劳动成果,从正规渠道进行购买哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,049评论 18 139
  • 故宫的秋 来得格外清 来得格外净 来得格外有韵味 天是空明的碧蓝色 墙是侬丽的朱红色 光从槐树叶底丝丝漏下 道旁堆...
    吴蕙兰阅读 333评论 0 0
  • 范师傅提醒,表情表达不好,是不是图画的太小了。今天放大了画,果真不一样啊。只是油性笔涂色的时候有些晕染,用什么方法...
    柳成林888阅读 174评论 0 0
  • 标题来源于刚刚看的一篇公众号文章的标题,也正是该文让我升起写点什么的欲望。 大概是当人强大到一定地步,会得到周遭关...
    耕吧阅读 132评论 0 2