1.http协议:全称“超文本传输协议”,浏览器和服务器之间的通信规则
2.HTTP协议永远是客户端发起请求,服务器回送响应
3.用户发送请求的方式:“
GET
”和“POST”请求
- “GET”请求:向服务器索取数据的一种请求方式
- “POST”请求:向服务器提交数据的一种请求方法,如“用户登录”等等
4.HTTP请求主要由两部分组成:http请求头、http请求体
注意:只有POST请求才有请求体
5.请求的参数有两种形式:(1)放在URL后面 (2)放在请求体中
6.HTTP响应主要由两部分组成:响应头、响应内容
7.HTTP响应有个状态码,表示响应的结果,例如:404表示未找到页面
8.访问网络的方式:同步请求、异步请求
- 同步请求:数据的请求过程是在主线程来执行的。但网络数据加载需要一个时间过程,这样会阻塞主线程
- 异步请求:数据的请求过程在多线程中来执行
- 同步请求无法取消,异步请求过程中可以取消;同步请求无法监听加载进度,异步请求可以监听
9.访问网络的基本流程:
- 构造URL地址
- 生成NSURLRequest请求
- 通过NSURLConnection发送请求
- 通过返回NSURLRespond实例和NSError实例分析结果
- 接受返回数据
10.同步请求:
//1.
构建
URL
地址
NSURL
*url = [
NSURL
URLWithString
:
@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"
];
//2.
构建请求
NSURLRequest
//NSURLRequest:
不可变对象,不能动态地添加请求信息
NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url];
//2.1 设置请求方式
[request setHTTPMethod : @"GET" ];
//2.2 设置超时时间
[request setTimeoutInterval : 60 ];
//2.3 设置请求头信息
// [request setAllHTTPHeaderFields:<#(NSDictionary *)#>];
// [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
// [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
[request setValue : @"gzip" forHTTPHeaderField : @"Accept-Encoding" ];
//2.4 设置请求体(只有POST请求才有请求体)
// [request setHTTPBody:<#(NSData *)#>];
NSMutableURLRequest *request = [ NSMutableURLRequest requestWithURL :url];
//2.1 设置请求方式
[request setHTTPMethod : @"GET" ];
//2.2 设置超时时间
[request setTimeoutInterval : 60 ];
//2.3 设置请求头信息
// [request setAllHTTPHeaderFields:<#(NSDictionary *)#>];
// [request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
// [request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>];
[request setValue : @"gzip" forHTTPHeaderField : @"Accept-Encoding" ];
//2.4 设置请求体(只有POST请求才有请求体)
// [request setHTTPBody:<#(NSData *)#>];
//2.5设置缓存(只有GET请求才能缓存)
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
//3.
构造
NSURLConnection,
发送网络请求
NSHTTPURLResponse *response = nil ;
NSError *error = nil ;
// 发送同步请求
NSHTTPURLResponse *response = nil ;
NSError *error = nil ;
// 发送同步请求
NSData
*data = [
NSURLConnection
sendSynchronousRequest
:request
returningResponse
:&response
error
:&error];
//4.
获取数据显示
// 将 data 转成字符串
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
self . textView . text = jsonStr;
// 解析 json 数据
// 将 data 转成字符串
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
self . textView . text = jsonStr;
// 解析 json 数据
NSDictionary
*dic = [
NSJSONSerialization
JSONObjectWithData
:data
options
:
NSJSONReadingMutableContainers
error
:
nil]
;
NSLog
(
@"
数据结果
:%@"
, dic);
//5.
获取响应信息
NSInteger statusCode = response. statusCode ;
NSDictionary *allHeaderFields = response. allHeaderFields ;
NSInteger statusCode = response. statusCode ;
NSDictionary *allHeaderFields = response. allHeaderFields ;
11.异步请求
//1.
构建
URL
地址
NSURL *url = [ NSURL URLWithString : @"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000" ];
//2. 构建 Request
NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] init ];
[request setURL :url];
[request setTimeoutInterval : 60 ];
[request setHTTPMethod : @"POST" ];
// 添加请求数据
NSString *paras = @"cinema_id=1533" ;
NSData *data = [paras dataUsingEncoding : NSUTF8StringEncoding ];
[request setHTTPBody :data];
NSURL *url = [ NSURL URLWithString : @"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000" ];
//2. 构建 Request
NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] init ];
[request setURL :url];
[request setTimeoutInterval : 60 ];
[request setHTTPMethod : @"POST" ];
// 添加请求数据
NSString *paras = @"cinema_id=1533" ;
NSData *data = [paras dataUsingEncoding : NSUTF8StringEncoding ];
[request setHTTPBody :data];
//3.发送请求
//
发送异步请求(基于
block
),无法监听数据传输,也不能监听传输的速度
//NSOperationQueue 队列,请求的线程会被添加到对列中
//completionHandler :数据请求完之后,调用此 block ,此 block 是多线程调用的
NSOperationQueue *queue = [[ NSOperationQueue alloc ] init ];
[ NSURLConnection sendAsynchronousRequest :request queue :queue completionHandler :^( NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError)
{
return ;
}
// 多线程调用
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
// 回到主线程刷新 UI
dispatch_async ( dispatch_get_main_queue (), ^{
self . textView . text = jsonStr;
});
//NSOperationQueue 队列,请求的线程会被添加到对列中
//completionHandler :数据请求完之后,调用此 block ,此 block 是多线程调用的
NSOperationQueue *queue = [[ NSOperationQueue alloc ] init ];
[ NSURLConnection sendAsynchronousRequest :request queue :queue completionHandler :^( NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError)
{
return ;
}
// 多线程调用
NSString *jsonStr = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding ];
// 回到主线程刷新 UI
dispatch_async ( dispatch_get_main_queue (), ^{
self . textView . text = jsonStr;
});
}];
12.
#pragma mark - NSURLConnectionDataDelegate
// 接收到服务器的响应
- ( void )connection:( NSURLConnection *)connection didReceiveResponse:( NSHTTPURLResponse *)response
{
NSDictionary *fields = response. allHeaderFields ;
NSLog ( @"fields is %@" ,fields);
self . recevieData = [[ NSMutableData alloc ] init ];
}
// 接收服务器传输的数据,如果数据量足够大,此方法会被调用多次,因为数据是分批次传输的
- ( void )connection:( NSURLConnection *)connection didReceiveData:( NSData *)data
{
// 对每次传输的数据进行拼接
[ self . recevieData appendData :data];
NSLog ( @" 接收到 %ld 字节的数据 " ,data. length );
}
- ( void )connectionDidFinishLoading:( NSURLConnection *)connection
{
NSLog ( @" 数据接收完成 " );
// 将 data 转成字符串
NSString *jsonStr = [[ NSString alloc ] initWithData : self . recevieData encoding : NSUTF8StringEncoding ];
self . textView . text = jsonStr;
// 将接收到的数据保存到沙盒
// [self.recevieData writeToFile:[NSHomeDirectory() stringByAppendingString:@"/QQMusic.dmg"] atomically:YES];
}
// 请求失败调用的协议方法
- ( void )connection:( NSURLConnection *)connection didFailWithError:( NSError *)error
{
NSLog ( @" 请求失败 " );
// 接收到服务器的响应
- ( void )connection:( NSURLConnection *)connection didReceiveResponse:( NSHTTPURLResponse *)response
{
NSDictionary *fields = response. allHeaderFields ;
NSLog ( @"fields is %@" ,fields);
self . recevieData = [[ NSMutableData alloc ] init ];
}
// 接收服务器传输的数据,如果数据量足够大,此方法会被调用多次,因为数据是分批次传输的
- ( void )connection:( NSURLConnection *)connection didReceiveData:( NSData *)data
{
// 对每次传输的数据进行拼接
[ self . recevieData appendData :data];
NSLog ( @" 接收到 %ld 字节的数据 " ,data. length );
}
- ( void )connectionDidFinishLoading:( NSURLConnection *)connection
{
NSLog ( @" 数据接收完成 " );
// 将 data 转成字符串
NSString *jsonStr = [[ NSString alloc ] initWithData : self . recevieData encoding : NSUTF8StringEncoding ];
self . textView . text = jsonStr;
// 将接收到的数据保存到沙盒
// [self.recevieData writeToFile:[NSHomeDirectory() stringByAppendingString:@"/QQMusic.dmg"] atomically:YES];
}
// 请求失败调用的协议方法
- ( void )connection:( NSURLConnection *)connection didFailWithError:( NSError *)error
{
NSLog ( @" 请求失败 " );
}
13.AF
- AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
所有的网络请求,均有manager发起
- 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON,如果提交数据是JSON的,需要将请求格式设置为AFJSONRequestSerializer
- 请求格式
AFHTTPRequestSerializer
二进制格式
AFJSONRequestSerializer JSON
AFJSONRequestSerializer JSON
AFPropertyListRequestSerializer PList(是一种特殊的XML,解析起来相对容易)
- 返回格式
AFHTTPResponseSerializer
二进制格式
AFJSONResponseSerializer JSON
AFXMLParserResponseSerializer XML, 只能返回 XMLParser, 还需要自己通过代理方法解析
AFXMLDocumentResponseSerializer (Mac OS X)
AFPropertyListResponseSerializer PList
AFImageResponseSerializer Image
AFJSONResponseSerializer JSON
AFXMLParserResponseSerializer XML, 只能返回 XMLParser, 还需要自己通过代理方法解析
AFXMLDocumentResponseSerializer (Mac OS X)
AFPropertyListResponseSerializer PList
AFImageResponseSerializer Image
AFCompoundResponseSerializer 组合
NSDictionary
*params =
@{
@"status"
:
@“需要
发布的微博内容
"
,
@"access_token"
:
@"2.00dW_qRD2O4AeEf6026c7ed50053l5"
}
;
方法一:
AFHTTPRequestSerializer
*requestSerializer = [
AFHTTPRequestSerializer
serializer
];
NSMutableURLRequest *request = [requestSerializer requestWithMethod:@"
POST
" URLString:urlString parameters:params error:nil];
//2.
构建连接操作对象
AFHTTPRequestOperation
*operation = [[
AFHTTPRequestOperation
alloc
]
initWithRequest
:request];
//3.
设置返回数据的解析方式
JSON
解析:
AFJSONResponseSerializer
XML解析:AFXMLParserResponseSerializer
operation.
responseSerializer
= [
AFJSONResponseSerializer
serializerWithReadingOptions
:
NSJSONReadingMutableContainers
];
// 设置数据请求成功、失败调用的 block
[operation setCompletionBlockWithSuccess :^( AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功
NSLog ( @"responseObject is %@" , responseObject);
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败
NSLog ( @"error is %@" , error);
}];
// 添加到队列中,发送请求
queue = [[ NSOperationQueue alloc ] init ];
// 设置数据请求成功、失败调用的 block
[operation setCompletionBlockWithSuccess :^( AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功
NSLog ( @"responseObject is %@" , responseObject);
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败
NSLog ( @"error is %@" , error);
}];
// 添加到队列中,发送请求
queue = [[ NSOperationQueue alloc ] init ];
[queue addOperation:operation];
方法二:
//
所有的网络请求,均有manager发起
AFHTTPRequestOperationManager
*manager = [
AFHTTPRequestOperationManager
manager
];
AFHTTPRequestOperation
*operation = [manage
POST
:urlString
parameters
:params
success
:^(
AFHTTPRequestOperation
*operation,
id
responseObject) {
NSLog ( @"responseObject is %@" ,responseObject);
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
NSLog ( @"error is %@" ,error);
NSLog ( @"responseObject is %@" ,responseObject);
} failure :^( AFHTTPRequestOperation *operation, NSError *error) {
NSLog ( @"error is %@" ,error);
}];
operation.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
14.TCP与UDP区别:
TCP:(1)面向连接 (2)可靠 (3)传输大量数据 (4)慢
UDP:(1)面向非连接 (2)不可靠 (3)传输少量数据 (4)快