URL:约定传输的数据
schema://host[abs_path][?query_string]
http消息(Http message)用于请求和响应
从客户端到服务端的请求消息:http Request
从服务端到客户端的响应: http Response
Request
http协议方法
- GET 查
- POST 增 ->已经包含了PUT 和 DELETE 的方法
- PUT 改
- DELETE 删
所以一般情况下,都是用GET和POST来请求
GET VS POST
个人的理解就是:GET用于查询信息使用,涉及到增删改的操作用POST
http header
host
1.指定网络请求的主机和端口号
2.通常从http URL中提取·1的信息。
3.必须的Headeruser-agent
1.包含发起请求的用户的相关信息
2.用于识别发起请求的用户Content - type
1.指明发送信息是什么格式例如:json合适,utf8编码
格式列举:
x-www-form-urlencoded : key value的格式
from-data 一般上传文件用这个格式
Accept
1.请求端指定可以接受那些响应格式,(服务端可以不管直接发送自己的媒体格式)Content Encoding:gzip
1.告诉服务端是采用哪种编码格式压缩的,这里是通过gzip格式压缩的.(无论客户端还是服务端都会将这个gzip的压缩、解压掉)Accept Encoding:gzip
1.返回给客户端可以接受的编码格式Content-length
1.发送给接收者body的大小
2.以十进制的字节表示Cookie
1.将Cookie的值发给服务端,服务端记录这个值
2.避免每次请求都带着身份信息
3.可以记录客户端请求的状态
http协议网络层次
快速记忆方式:物联网传话试用
- http应用层协议
- 通过TCP作为其传输层
- IP作为其网络层
NSURLSession
-
不通过Delegate来获取返回的数据
- (void)testNSURLSession {
NSURL *url = [NSURL URLWithString:@"https://api.douban.com/v2/book/17604305?fields=title,id,url,publisher,author"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@", response);
self.response = response;
self.responseData = [NSMutableData dataWithData:data];
self.responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
self.responseInfo = [NSJSONSerialization JSONObjectWithData:self.responseData options:0 error:nil];
NSLog(@"返回数据: %@", self.responseString);
}];
[task resume];
}
NSURLSession Post请求
- (void)testPostRequestWithNSURLSession {
NSURL *url = [NSURL URLWithString:kPutsreqTestURL];
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
mutableRequest.HTTPMethod = @"POST";
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parameters = @{@"book": @(17604305), @"title":@"好书", @"comment":@"我觉得这是一本好书", @"rating":@(5)};
NSData *body = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
[mutableRequest setHTTPBody:body];
NSURLSession *session = [NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionTask *task = [session dataTaskWithRequest:mutableRequest];
[task resume];
}
通过NSURLSessionTask的子类完成下载方法
下载文件
//下载文件
#pragma mark - Demo 2: NSURLSessionDownloadTask
- (void)testURLSessionDownloadTask {
NSURL *url = [NSURL URLWithString:@"https://codeload.github.com/AFNetworking/AFNetworking/zip/master"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration]];
//通过下面方法下载文件,省去了下载大文件占过大内存的问题,这里会将下载好的文件存到临时的一个地址里。
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error.code == 0) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
NSURL *destination = [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
//将下载好的文件从临时的地址移动到自己设置好的地址
[[NSFileManager defaultManager] moveItemAtURL:location toURL:destination error:nil];
}
}];
[task resume];
}