Charles —— 青花瓷

  • 网络抓包工具
  • 可以拦截 iPhone/Android 手机中 App 的非加密网络请求数据

使用

  • 手机&电脑在同一个局域网
  • 确保电脑能够通过路由器访问互联网
  • 电脑安装 Charles
  • 启动 Charles,禁用 MAC OS X Proxy & Mozilla FireFox Proxy
  • 设置手机的网络代理
    • ip: 电脑的 ip
    • 端口: 8888

注意,如果让电脑通过手机的 3G 访问网络,无法拦截数据

拦截网易新闻数据

分类 URL
新闻首页 http://c.m.163.com/nc/article/headline/T1348647853363/0-20.html
科技 http://c.m.163.com/nc/article/list/T1348649580692/0-20.html
手机 http://c.m.163.com/nc/article/list/T1348649654285/0-20.html
移动互联 http://c.m.163.com/nc/article/list/T1351233117091/0-20.html
首页广告 http://c.m.163.com/nc/ad/headline/0-4.html

网络访问

建立网络访问单例

  1. + (instancetype)sharedManager {
  2. static NetworkTools *instance;
  3. static dispatch_once_t onceToken;
  4. dispatch_once(&onceToken, ^{
  5. // 注意:baseURL 应该以 / 结尾
  6. NSURL *baseURL = [NSURL URLWithString:@"http://c.m.163.com/nc/article/headline/"];
  7. NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  8. instance = [[self alloc] initWithBaseURL:baseURL sessionConfiguration:config];
  9. return instance;
  10. }

加载新闻首页数据

  1. - (void)loadData {
  2. [[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
  3. NSLog(@"%@ %@", responseObject, [responseObject class]);
  4. } failure:^(NSURLSessionDataTask *task, NSError *error) {
  5. NSLog(@"%@", error);
  6. }];
  7. }

运行测试,statecode == 200,但是不支持数据格式 "text/html"

扩展反序列化格式类型

  • NetworkTools 单例中,扩展反序列化格式类型
  1. instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];

字典转模型

字典使用技巧 - 取第一个键值内容

  1. // 直接取出字典中第一个 key T1348647853363 对应的数组
  2. NSArray *array = responseObject[responseObject.keyEnumerator.nextObject];
  3. NSLog(@"%@", array);

新闻模型

.h

  1. /// 标题
  2. @property (nonatomic, copy) NSString *title;
  3. /// 摘要
  4. @property (nonatomic, copy) NSString *digest;
  5. /// 配图地址
  6. @property (nonatomic, copy) NSString *imgsrc;
  7. + (instancetype)newsWithDict:(NSDictionary *)dict;

.m

  1. + (instancetype)newsWithDict:(NSDictionary *)dict {
  2. id obj = [[self alloc] init];
  3. [obj setValuesForKeysWithDictionary:dict];
  4. return obj;
  5. }

字典转模型

  1. NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:array.count];
  2. [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  3. [arrayM addObject:[News newsWithDict:obj]];
  4. }];
  5. NSLog(@"%@", arrayM);

运行测试-崩溃

  • 因为网络字典中的属性键值比 News 模型中的属性多,直接使用 setValuesForKeysWithDictionary 方法会崩溃

修改新闻模型

  1. + (instancetype)newsWithDict:(NSDictionary *)dict {
  2. id obj = [[self alloc] init];
  3. NSArray *properties = [self properties];
  4. for (NSString *key in properties) {
  5. if (dict[key] != nil) {
  6. [obj setValue:dict[key] forKey:key];
  7. }
  8. }
  9. return obj;
  10. }
  11. + (NSArray *)properties {
  12. return @[@"title", @"digest", @"imgsrc"];
  13. }

增加 description

  1. - (NSString *)description {
  2. NSDictionary *dict = [self dictionaryWithValuesForKeys:[News properties]];
  3. return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, dict];
  4. }

利用运行时动态获取类属性

  1. const char* propertiesKey = "propertiesKey";
  2. + (NSArray *)properties {
  3. NSMutableArray *arrayM = objc_getAssociatedObject(self, propertiesKey);
  4. if (arrayM != nil) {
  5. NSLog(@"返回关联数组");
  6. return arrayM;
  7. }
  8. NSLog(@"动态获取类属性");
  9. unsigned int count = 0;
  10. objc_property_t *ptys = class_copyPropertyList([self class], &count);
  11. arrayM = [NSMutableArray arrayWithCapacity:count];
  12. for (unsigned int i = 0; i < count; ++i) {
  13. objc_property_t pty = ptys[i];
  14. const char* cname = property_getName(pty);
  15. [arrayM addObject:[NSString stringWithUTF8String:cname]];
  16. }
  17. free(ptys);
  18. objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  19. return arrayM;
  20. }

浅谈Charles —— 青花瓷的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. MySQL查看没有主键的表

    select table_schema, table_name from information_schema.tables where table_name not in (select disti ...

  2. Mybatis-03-日志

    日志 1 日志工厂 如果一个数据库操作,出现了异常,需要排错,此时需要日志. 曾经:sout debug 现在:日志工厂 logImpl SLF4J/log4j(掌握)/log4j2 设置中可以设定日 ...

  3. SG 函数学习

    \(Mex\) 运算 \(mex(S)\) 为不属于集合 \(S\) 的最小非负整数,即: \[mex(S)=\min \limits_{x \in \mathbb{N},x \not\in S} \ ...

  4. 性能分析(7)- 未利用系统缓存导致 I/O 缓慢案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前提 前面有学到 Buffer 和 Cache 的 ...

  5. Android 用versionName判断版本大小(是否进行版本更新)

    一般情况下都是用versionCode进行版本大小的判断从而进行判断是否进行app的更新,但是有可能从网站上爬下来的versionCode不准确,有的网站叫做build,所以用versionName进 ...

  6. mysql-STRAIGHT_JOIN-优化

    性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOIN is simi ...

  7. ubuntu apt-mirror 同步源到本地

    1.下载 apt-mirror apt-get install apt-mirror 2.修改配置 root@wangjq:/wangjq# cat /etc/apt/mirror.list##### ...

  8. keepalived的vrrp多播报文被禁,导致VIP同时位于多个机器上

    keepalived的vrrp多播报文被禁,导致VIP同时位于多个机器上 查看man keepalived.conf,VRRP instances中给出了单播的设置方法,添加unicast_peer即 ...

  9. 2020.5.26 第六篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...

  10. js实现树级递归,通过js生成tree树形菜单(递归算法)

    方法封装: /** * 数据转换为树形(递归),示例:toTreeByRecursion(source, 'id', 'parentId', null, 'children') * @param {A ...