Objective-C 笔记 – 网络请求

获取页面数据

- (void)viewDidLoad {
    [super viewDidLoad];
    // URL
    NSURL * url = [NSURL URLWithString:@"https://m.baidu.com"];
    // 请求
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    // 连接服务器
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        // data是返回数据的16进制,需要转换
        NSString * html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }];
}

头信息

// URL
// 请求
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
// 头信息
[request setValue:@"iPhone" forHTTPHeaderField:@"User-Agent"];
// 发送请求

缓存

// URL
// 请求
NSURLRequest * request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0]
// 发送请求

cachePolicy定义缓存的类型,是个枚举类型

  • NSURLRequestUseProtocolCachePolicy = 0,默认缓存策略
  • NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地缓存,新闻等APP常用
  • NSURLRequestReturnCacheDataElseLoad = 2,返回缓存数据,如果没有缓存从服务器加载
  • NSURLRequestReturnCacheDataDontLoad = 3,返回缓存数据,如果没有缓存,就空着

回调代码块

// 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    NSLog(@"喵喵喵");
}];

参数

  • response(NSHTTPURLResponse) 服务器的响应
    • URL 服务器返回的URL,绝大部分和请求的URL一样,重定向时不一样
    • MIMEType 二进制数据文件类型
    • expectedContentLength 下载文件的长度
    • textEncodingName 文本编码名称
    • suggestedFilename 服务器建议的保存文件名称
    • statusCode 状态码
    • allHeaderFields 所有相应头的内容
  • data 返回数据
  • connectionError 错误

JSON反序列化

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
}];

一个JSON对象应该具有以下属性

  • 顶级节点是一个NSArray 或 NSDictionary
  • 所有对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull
  • 所有字典的key必须是NSString
  • NSNumber 不能是无理数或空

options参数

  • NSJSONReadingMutableContainers 容器节点是可变的
  • NSJSONReadingMutableLeaves 子节点是可变的
  • NSJSONReadingAllowFragments 允许顶级节点不是NSArray或NSDictionary

PList反序列化

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    id result = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
}];

options参数

  • NSPropertyListImmutable 不可变
  • NSPropertyListMutableContainers 容器可变
  • NSPropertyListMutableContainersAndLeaves 容器和子节点都可变