浅谈Charles —— 青花瓷
Charles —— 青花瓷
- 网络抓包工具
- 可以拦截 iPhone/Android 手机中 App 的
非加密
网络请求数据
使用
- 手机&电脑在同一个局域网
- 确保电脑能够通过路由器访问互联网
- 电脑安装
Charles
- 启动
Charles
,禁用MAC OS X Proxy
&Mozilla FireFox Proxy
- 设置手机的网络代理
ip
: 电脑的 ip端口
: 8888
注意,如果让电脑通过手机的 3G
访问网络,无法拦截数据
拦截网易新闻数据
网络访问
建立网络访问单例
+ (instancetype)sharedManager {
static NetworkTools *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 注意:baseURL 应该以 / 结尾
NSURL *baseURL = [NSURL URLWithString:@"http://c.m.163.com/nc/article/headline/"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
instance = [[self alloc] initWithBaseURL:baseURL sessionConfiguration:config];
return instance;
}
加载新闻首页数据
- (void)loadData {
[[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@ %@", responseObject, [responseObject class]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", error);
}];
}
运行测试,statecode == 200,但是不支持数据格式 "text/html"
扩展反序列化格式类型
- 在
NetworkTools
单例中,扩展反序列化格式类型
instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
字典转模型
字典使用技巧 - 取第一个键值内容
// 直接取出字典中第一个 key T1348647853363 对应的数组
NSArray *array = responseObject[responseObject.keyEnumerator.nextObject];
NSLog(@"%@", array);
新闻模型
.h
/// 标题
@property (nonatomic, copy) NSString *title;
/// 摘要
@property (nonatomic, copy) NSString *digest;
/// 配图地址
@property (nonatomic, copy) NSString *imgsrc;
+ (instancetype)newsWithDict:(NSDictionary *)dict;
.m
+ (instancetype)newsWithDict:(NSDictionary *)dict {
id obj = [[self alloc] init];
[obj setValuesForKeysWithDictionary:dict];
return obj;
}
字典转模型
NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:array.count];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[arrayM addObject:[News newsWithDict:obj]];
}];
NSLog(@"%@", arrayM);
运行测试-崩溃
- 因为网络字典中的属性键值比 News 模型中的属性多,直接使用
setValuesForKeysWithDictionary
方法会崩溃
修改新闻模型
+ (instancetype)newsWithDict:(NSDictionary *)dict {
id obj = [[self alloc] init];
NSArray *properties = [self properties];
for (NSString *key in properties) {
if (dict[key] != nil) {
[obj setValue:dict[key] forKey:key];
}
}
return obj;
}
+ (NSArray *)properties {
return @[@"title", @"digest", @"imgsrc"];
}
增加 description
- (NSString *)description {
NSDictionary *dict = [self dictionaryWithValuesForKeys:[News properties]];
return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, dict];
}
利用运行时动态获取类属性
const char* propertiesKey = "propertiesKey";
+ (NSArray *)properties {
NSMutableArray *arrayM = objc_getAssociatedObject(self, propertiesKey);
if (arrayM != nil) {
NSLog(@"返回关联数组");
return arrayM;
}
NSLog(@"动态获取类属性");
unsigned int count = 0;
objc_property_t *ptys = class_copyPropertyList([self class], &count);
arrayM = [NSMutableArray arrayWithCapacity:count];
for (unsigned int i = 0; i < count; ++i) {
objc_property_t pty = ptys[i];
const char* cname = property_getName(pty);
[arrayM addObject:[NSString stringWithUTF8String:cname]];
}
free(ptys);
objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return arrayM;
}
浅谈Charles —— 青花瓷的更多相关文章
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
随机推荐
- Linux内核之 基本概念
一直想写写Linux内核的文章,特别是进程这方面的,说实话,不好写,也不太敢写:)直到遇到了一本好书.<Linux内核设计与实现>,原书<Linux Kernel Developme ...
- oracle语法查某个字段为空
select * from t_address_express_mapping t where t.start_house_number is null;
- 44. Spring Security FAQ春季安全常见问题
第44.1节,“一般问题” 第44.2节,“常见问题” 第44.3节,“春季安全架构问题” 第44.4节,“常见”如何“请求 44.1 General Questions 第44.1.1节,“Spri ...
- 你们要的MyCat实现MySQL分库分表来了
❝ 借助MyCat来实现MySQL的分库分表落地,没有实现过的,或者没了解过的可以看看 ❞ 前言 在之前写过一篇关于mysql分库分表的文章,那篇文章只是给大家提供了一个思路,但是回复下面有很多说是细 ...
- Python 批量保存word
from docx import Document path = r'D:\pywork\12' # word信息表所在文件夹 w = Document(path + '/' + 'word模板表.d ...
- Jmeter 常用函数(25)- 详解 __V
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 执行变量名表达式,并返回执行结果 它可 ...
- 在我们使用Redis作为一个LRU缓存的时候,怎么做才能更高效
当用Redis作为一个LRU存储时,有些时候是比较方便的,在你增添新的数据时会自动驱逐旧的数据.这种行为在开发者论坛是非常有名的,因为这是流行的memcached系统的默认行为. LRU实际上只是支持 ...
- 第2章 RDD编程(2.1-2.2)
第2章 RDD编程 2.1 编程模型 在Spark中,RDD被表示为对象,通过对象上的方法调用来对RDD进行转换.经过一系列的transformations定义RDD之后,就可以调用actions触发 ...
- Discovering Reinforcement Learning Algorithms
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2007.08794v1 [cs.LG] 17 Jul 2020 Abstract 强化学习(RL)算法根据经过多年研究手动发 ...
- 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩
前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...