iOS中的HTTP请求处理

IOS中的HTTP请求处理

一、HTTP协议

1、定义

HTTP的全称:超文本传输协议,用来定制传输数据的规范(客户端和服务器之间的数据传输规范)

HTTP完整通信过程:请求行、请求头、请求体

二、通信过程

1、请求(客户端到服务端)

状态行

请求头(描述客户端信息)

请求体(POST请求才有,存放具体数据)

2、响应(服务端到客户端)

状态行(响应行:HTTP协议版本\状态码\状态信息)

响应头(服务器信息\返回数据类型\返回数据长度)

实体内容(响应体,返回给客户端的具体内容)

三、HTTP请求类型

1GET

  • 参数拼接在URL后面
  • 参数有限制

2POST

  • 参数都在请求体
  • 参数没有限制
  • 文件上传只能用POST

3HEAD

  • 获得响应头信息,不获取响应体
  • request.HTTPMethod = @"HEAD";

4Delete

四、IOS中发送GET\POST的方式

1NSURLConnection

  • 苹果原生
  • 使用起来比ASI\AFN复杂

2ASI

  • 基于CFNetwork
  • 提供了非常多强大的功能,使用简单

3AFN

  • 基于NSURLConnection
  • 提供了常用的功能(无法监听进度)


五、NSURLConnection

1、发送同步请求

//响应对象
    NSURLResponse *response = nil;
    //错误类
    NSError *error = nil;
    //发送同步请求
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

2、发送异步请求(block

//请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"URLString"]];
    //异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
    }];

3、发送异步请求(delegate

//第一种
    [NSURLConnection connectionWithRequest:request delegate:self];
    //第二种
    [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    //第三种
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    [connection start];

4、文件下载(大文件下载)

方案:边下载边写入(写到沙盒的某个文件中)

具体实现:

a.在接收到服务器的响应时,创建一个空文件

NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager createFileAtPath:@"文件路径" contents:nil attributes:nil];

b.创建一个跟空文件相关联的句柄对象

NSFileHandle *writeHandler = [NSFileHandle fileHandleForReadingAtPath:@"文件路径"];

c.在接收到服务器数据时,利用句柄对象将服务器返回的数据写入

//移动到尾部
    [self.writeHandler seekToEndOfFile];
    //从当前为开始写
    [self.writeHandler writeData:data];

d.在接受完数据后,关闭句柄

//关闭句柄
    [self.writeHandler closeFile];
    self.writeHandler = nil;

5、断点下载

设置请求头的Range,告诉服务器下载哪一段数据

NSString *values = [NSString stringWithFormat:@"bytes=%lld-%lld",self.begin + self.currentLength, self.end];
    
    [request setValue:value forHTTPHeaderField:@"Range"];

6、文件上传

只能用POST请求,请求参数都在请求体中(文件参数\非文件类型的参数)

a.拼接请求体(文件参数)

#define HMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
    NSMutableData *body  = [NSMutableData data];
    //参数开始标记
    [body appendData:HMEncode(@"--heima\r\n")];
    //参数描述
    [body appendData:HMEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"20140519_27.png\"\r\n")];
    // 文件类型:Content-Type
    [body appendData:HMEncode(@"Content-Type: image/png\r\n")];
    //\r\n文件二进制数据\r\n
    [body appendData:HMEncode(@"\r\n")];
    NSData *fileData = UIImagePNGRepresentation(image);
    [body appendData:fileData];
    [body appendData:HMEncode(@"\r\n")];
    //结束
    [body appendData:HMEncode(@"--heima--\r\n")];
    request.HTTPBody = body;

b.设置请求头

请求数据长度:

[request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];


请求数据类型Content-Type:

普通的post请求:application/x-www-form-urlencoded
上传文件的post请求:multipart/form-data;boundary=boundary

六、NSURLCache缓存

获取全局缓存对象

NSURLCache *cache = [NSURLCache sharedURLCache];

设置缓存容量

cache.memoryCapacity = 1024 * 1024;
cache.diskCapacity = 20 * 1024 * 1024;

设置请求的缓存策略

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

/**

 *  AuthorJn

 *  GitHubhttps://github.com/JnKindle

 *  cnblogshttp://www.cnblogs.com/JnKindle

 *  QQ1294405741

 */





猜你喜欢

转载自blog.csdn.net/RangingWon/article/details/53857818