注意事项:
1.如果网址中存在中文,进行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
一些理论知识:
1. GET请求和POST请求的区别
1.1 GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过?来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。
1.2 GET请求参数会出现在接口中,不安全。而POST请求相对安全。
1.3 虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。
2. 同步和异步的区别
同步链接: 主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序假死现象。
异步链接: 会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。
3.NSJSONSerialization中options参数中几个参数的含义:
// NSJSONReadingMutableContainers:返回可变容器,NSMutableDictionary或NSMutableArray。
// NSJSONReadingMutableLeaves:返回的JSON对象中字符串的值为NSMutableString
// NSJSONReadingAllowFragments:允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment。例如使用这个选项可以解析 @“123” 这样的字符串。
1. 同步请求 GET
// 设置请求路径
NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 发送请求
// 发送同步请求,在主线程执行
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
2. 同步请求 POST
// 设置请求路径
NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list";
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 创建参数字符串对象
NSString *parmStr = @"uid=3&oid=1";
// 将字符串转为NSData对象
NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
// 设置请求体
[request setHTTPBody:pramData];
// 这是请求方式
[request setHTTPMethod:@"POST"];
// 创建同步链接
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
3. 异步请求 GET
3.1 block
// 设置请求路径
NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 发送请求
// 发送异步请求
// 创建一个队列(默认添加到该队列中的任务异步执行)
// NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 获取一个主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
// 不管参数传入的是不是mainQueue,sendAsynchronousRequest都是异步请求数据,传入的queue为mainQueue则block中的代码是在主线程中完成,而传入的queue不是主线程时,则block中的代码则不是在主线程中完成
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
}];
3.2 delegate
// 设置请求路径
NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list?uid=3&oid=1";
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求对象
// NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 默认就是GET请求
// 设置请求超时
// NSMutableURLRequest是NSURLRequest的子类,常用的方法有:
// 设置请求超时等待时间(超过这个时间就算超时,请求失败)-(void)seetTimeoutInterval:(NSTimeInterval)seconds;
// 设置请求方法(比如GET和POST) -(void)setHTTPMethod:(NSString *)method;
// 设置请求体 -(void)setHTTPBody:(NSData *)data;
// 设置请求头 -(void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = 5.0;
// 发送请求
// 使用代理发送异步请求(通常应用于文件下载)
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
#pragma mark - NSURLConnectionDataDelegate
// 当接收到服务器的响应(连通了服务器)时会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"接收到服务器的响应 %i", [NSThread isMainThread]); // >> 主线程
_allData = [NSMutableData data];
}
// 当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"接收到服务器的数据 %i", [NSThread isMainThread]); // >> 主线程
[_allData appendData:data];
}
// 当服务器的数据加载完毕时就会调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"服务器的数据加载完毕 %i", [NSThread isMainThread]); // >> 主线程
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_allData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
}
// 请求错误的时候调用(请求超时、断网、没有网。一般指客户端错误)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@“服务器数据请求失败 %i", [NSThread isMainThread]); // >> 主线程
}
4. 异步请求 POST
// 创建请求路径
NSString *urlStr = @"http://www.baidu.com/thcgi/get_todo_list";
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 创建参数字符串对象
NSString *parmStr = @"uid=3&oid=1";
// 将字符串转成NSData对象
NSData *parmData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
// 设置请求体
[request setHTTPBody:parmData];
// 设置请求方式
[request setHTTPMethod:@"POST"];
// 设置请求超时时间
[request setTimeoutInterval:5];
// 创建异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", dict);
}];