从15年就决定要写自己的技术博客,没想到一转眼就到了2016,终于开始。。。。
本文讲的是NSURLConnection的一些用法。
URL:Uniform Resource Locator(统一资源定位符)。
常见的协议:
Http(明文,端口80)/Https(加密,端口443)/File/Mailto/FTP
其中,Http有多种请求方法,最常用的是GET和POST,常用的返回状态码200-成功、400-参数错误、404-找不到对象、500-服务器错误。
GET:
协议://主机地址/路径?(参数)key1=value1&key2=value2&...//特点是相对不安全,传输量少,一般用于获取小量数据时使用,效率较高。
POST:
一般客户端给服务器提供信息较多时使用,相对GET方式较为安全,将请求参数封装在HTTP请求数据中,可传大量数据或文件,效率较低。
同步异步:
在主线程中创建一个同步连接会阻塞主线程,但如果新开一个线程,则不会阻塞主线程,此时,同步和异步的区别是运行runtime会为异步创建一个线程,而同步不会。
NSURLConnection
GET发送请求(数据量少,一般用同步)
NSString * httpUrl = @"url";
NSString * httpArg = @"参数";
NSString * apiKey = @"key";
NSURL * url = [NSURL urlWithString:[NSString stringWithFormat:@"%@?%@",httpUrl,httpArg]];
NSMutableURLRequest * murequest = [NSMutableURLRequest requestWithURL:url];//若无appKey则可创建NSURLRequest * request = [NSURLRequest requestWithURL:url];
[murequest addValue:apiKey forHTTPHeaderField: @"apiKey"];
NSHTTPURLResponse * response = nil;//创建一个响应
NSError * error = nil;//创建一个错误
NSData * data = [NSURLConnection sendSynchronousRequest:murequest returningResponse:&response error:&error];//接收服务器返回的数据
NSString * string = [NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
可打印查看NSLog(@"%@--%@",string,response.allHeaderFiellds);
POST发送请求(数据量多,一般用异步)
NSString * httpUrl = @"url";
NSString * httpArg = @"参数";
NSString * apiKey = @"key";
NSURL * url = [NSURL urlWithString:[NSString stringWithFormat:@"%@?%@",httpUrl,httpArg]];
NSMutableURLRequest * murequest = [NSMutableURLRequest requestWithURL:url];
[murequest setValue:apiKey forHTTPHeaderField: @"apiKey"];
murequest.timeoutInterval = 50;//设置请求超时时间
murequest.HTTPMethod = @"POST";//默认为GET
NSDictionary * body = @{@"参数"}
murequest.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:NSJSONWritingPretlyPrinted error:nil];
/*请求体:
1.顶层对象必须是NSArray或NSDictionary
2.所有的对象必须是NSString/NSNumber/NSArray/NSDictionary/NSNull的实例
3.所有NSDictionary的key必须是NSString类型
4.数字对象不能是非数值或无穷
*/异步发送请求,并解析
[NSURLConnection sendAsynchronousRequest:murequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
}];
代理方法
connection:didReceiveResponse:当接收到返回数据时会被调用,在其中进行了数据容器的初始化。
connection:didReceiveData:在接收数据过程中会多次被调用,其中会将接收到的数据传递进来。
connectionDidFinishLoading:在接收数据完成时被调用,可在其中将接收到的完整数据进行处理。