HTTP、NSURLConnection


URL:一个资源对应唯一的一个资源。(统一资源定位符)
协议:不同的协议代表不同的资源的查找方式,资源传输方式。
URL可以没有路径,但是必须有协议头。
scheme:协议头:找资源的方式(http:// ftp://)
path:路径

HTTP协议 :超文本传输协议,访问远程网络资。
file:访问本地计算机上的资源。
mailto:访问的是电子邮件地址。
FTP:共享主机的文件资源。

HTTP:允许传输各种各样的数据,0.9和1.0使用非持续连接,限制每次连接只处理一个请求,服务器响应客户端后马上断开连接,能节省传输 时间。


HTTP通信的两大步骤ß:

1、请求:客户端向服务器请求数据。
2、响应:服务器返回客户端相应的数据。

发送请求:常用的两种方式:GET和POST
GET:不需要设置请求体。建议:查。
POST:大文件, 相对安全。建议:增、删、改。


iOS发送HTTP请求的方案
苹果自带:
NSURLConnetion:简单,古老。
NSURLSession:功能比NSURLConnetion强大,苹果推荐。13年iOS7推出。
CFNetwork:NSURLSession的底层,纯C语言。
第三方框架
ASIHttpRequest:HTTP终结者之称,强大,停止更新。
AFNetworking:简单易用,维护者多。
MKNetworkkit:简单,维护者少。


NSURLRequest:一个NSURLRequest对象代表 一个请求。
将NSURL、请求头、请求体包装到NSURLRequest中,
然后使用NSURLConnetion来发送网络请求到服务器。

GET:
1、请求路径。
2、创建请求对象。
3、发送请求。

POST:
1、请求路径。
2、创建请求对象。
3、更改请求方法。request.HTTPMethod=@"POST"
4、设置请求体、请求头。request.HTTPBody,setValue:forHTTPHeaderField
5、设置超时。request.timeoutInterval = 6
6、发送请求。
比如是block的方式调用,当6秒后,服务器还没有返回数据,会调用block,并且block中的错误有值的 。

GET和POST区别:GET中包括了请求参数,POST请求参数放在请求体中。


NSURLConnection的三种方法:
方法一:同步请求。
方法二:异步请求,使用block回调。
方法三:代理的方式。(代理:NSURLConnectionDataDelegate。适合大文件)
设置代理方法在队列中执行:[对象 setDelegateQueue:]


注意:
1、异步请求没有返回值。返回的结果中NSURLResponse中的真实类型是NSHTTPURLResponse。
2、SVProgressHUD:有个好处,就是当刚开始显示的提示框还在显示时,如果后面又有提示框出现,那么直接将后面的提示的内容用刚开始的提示框直接显示。
3、NSURLConnection的initWithRequest:delegate:的代理是NSURLConnectionDataDelegate,并且自动start发送网络请求。这个方法内部默认是异步请求(看文档)。
4、NSURLConnection的initWithRequest:delegate:startImmediately:NO。是NO时需要手动(start)发送网络请求。如果设置为YES就自动(start)发送网络请求。默认也是异步请求.
5、取消方法cancel。
6、文件下载应该使用代理的方式。能一点一点的拼接。能监听数据的下载进度。接收完毕记得将存数据的属性赋值为nil。

7、坑:子线程中使用NSURLConnection来发送网络请求需要手动开启run子线程的runloop ---[[NSRunLoop currentRunLoop]run]。
因为子线程中的runloop默认是没有开启的,不像主线程中的runloop已经开启。其实没必要放到子线程中。
8、启动和停掉runloop的其他方式:CFRunLoopGetCurrent():获取当前的runloop。CFRunLoopRun():启动当前线程的runloop。CFRunLoopStop(启动的runloop)停掉括号中的runloop。


总结:

HTTP请求的常见方法
  • GET

    所有参数拼接在URL后面,并且参数之间用&隔开
    - 比如http://xxxxxx?name=123&pwd=123
    - 传递了2个参数给服务器
    - name参数:123
    - pwd参数:123
    没有请求体
    一般用来查询数据

  • POST
  • 所有参数都放在请求体
- 一般用来修改、增加、删除数据

创建HTTP请求

  • GET
// 请求路径
NSString *urlString = @"http://xxx?name=名字&pwd=123";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// 创建URL
NSURL *url = [NSURL URLWithString:urlString];

// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求方法(默认就是GET请求)
request.HTTPMethod = @"GET";
  • POST
// 请求路径
NSString *urlString = @"http://xxxxxx/图片名";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// 创建URL
NSURL *url = [NSURL URLWithString:urlString];

// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求方法
request.HTTPMethod = @"POST";

// 设置请求体
request.HTTPBody = [@"name=名字&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];

使用NSURLConnection发送HTTP请求

发送同步请求

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
// 这个方法是阻塞式的,会在当前线程发送请求
// 当服务器的数据完全返回时,这个方法才会返回,代码才会继续往下执行

发送异步请求-block

+ (void)sendAsynchronousRequest:(NSURLRequest*) request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
// 会自动开启一个子线程去发送请求
// 当请求完毕(成功\失败),会自动调用handler这个block
// handler这个block会放到queue这个队列中执行

发送异步请求-delegate

  • 创建NSURLConnection对象
// startImmediately==YES,创建完毕后,自动发送异步请求
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;
- (instancetype)initWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate; // 创建完毕后,自动发送异步请求
  • 发送请求
[connection start];
  • 遵守NSURLConnectionDataDelegate协议,实现协议中的代理方法
// 当接收到服务器的响应时就会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

// 每当接收到服务器返回的数据时就会调用1次(数据量大的时候,这个方法就会被调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

// 当服务器的数据完全返回时调用(服务器的数据接收完毕)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

// 当请求失败的时候调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
  • 取消请求
[connection cancel];

NSString和NSData的互相转换

  • NSString -> NSData
NSData *data = [@"xxxxx" dataUsingEncoding:NSUTF8StringEncoding];
  • NSData -> NSString
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  //发送请求给服务器,加载右侧的数据
        NSMutableDictionary *params = [NSMutableDictionary dictionary];
        params[@"xxx"] = @"xxxx";
        params[@"xxxx"] = @"xxxx";
        params[@"xxxx"] =@(xxxxx);
        [[AFHTTPSessionManager manager] GET:@"http://xxxxxxx" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
            //字典转模型数组
           NSArray *users = [XJQRecommendUser objectArrayWithKeyValuesArray:responseObject[@"xxxx"]];

            //添加当前类别对应的用户组
            [c.users addObjectsFromArray:users];
            //刷新表格
            [self.detailVC reloadData];

        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            [SVProgressHUD showErrorWithStatus:@"加载数据失败"];
        }];

你可能感兴趣的:(HTTP、NSURLConnection)