IOS网络编程层次模型
Cocoa层:NSURL,Bonjour,GameKit,WebKit
Core Foundation层:基于C的CFNetwork和CFNetService
OS层:基于C的BSD socket
本文要讨论的是NSURL部分。
GET和POST
GET和POST是网络请求的两种最常用方式。简单而言GET方式的网络请求服务器只会接收到一个包含或者不包含信息的URL链接。而POST方式的网络请求,通常会向服务器发送一个数据体。这两种方式的所有特性都是基于其这两个特点而产生的。
IOS的GET方式网络请求
步骤:
1、确定NSURL资源
2、创建NSURLRequest网络请求
3、创建NSURLConnection连接请求
4、启动连接
步骤:
1、遵循NSURLConnection代理协议
2、实现代理方法
3、创建一个可变NSData拼接服务器返回的NSData
4、重写代理方法
代码:
步骤:
1、确定NSURL资源
2、创建NSURLRequest网络请求
3、创建数据体,并向数据体封装数据
4、创建NSURLConnection连接请求
5、启动连接
代码:
NSURLConnection同步与异步请求
NSURLConnection还提供另外两种网络请求方式,一种是同步请求,一种是异步请求。用于不同的网络访问情况。
这两个方法分别是sendAsynchronousRequest和sendSynchronousRequest。
这里给出异步请求的代码:
Cocoa层:NSURL,Bonjour,GameKit,WebKit
Core Foundation层:基于C的CFNetwork和CFNetService
OS层:基于C的BSD socket
本文要讨论的是NSURL部分。
GET和POST
GET和POST是网络请求的两种最常用方式。简单而言GET方式的网络请求服务器只会接收到一个包含或者不包含信息的URL链接。而POST方式的网络请求,通常会向服务器发送一个数据体。这两种方式的所有特性都是基于其这两个特点而产生的。
IOS的GET方式网络请求
步骤:
1、确定NSURL资源
2、创建NSURLRequest网络请求
3、创建NSURLConnection连接请求
4、启动连接
代码:
//格式化请求的ULR链接,以及包含要发送的数据到URL链接
NSString *urlStr = [NSString stringWithFormat:@"http://www.baidu.com"];
//对包含中文的ULR链接进行UTF-8重新编码
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//将字符串转换为URL资源
NSURL *url = [NSURL URLWithString:urlStr];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建连接
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//启动连接
[conn start];
完成GET方式的网络请求,我们可以用NSURLConnection的代理方法处理服务器响应。
步骤:
1、遵循NSURLConnection代理协议
2、实现代理方法
3、创建一个可变NSData拼接服务器返回的NSData
4、重写代理方法
代码:
#pragma mark NSURLConnection代理方法
#pragma mark 1. 准备接收服务器响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"服务器响应:%@", response);
}
#pragma mark 2. 接收服务器传输的数据,可能会多次执行
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 对每次传输的数据进行拼接
[self.resData appendData:data];
}
#pragma mark 3. 接收数据完成,做后续处理
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// 处理数据,将NSData转化为NSString
NSString *str = [[NSString alloc]initWithData:self.resData encoding:NSUTF8StringEncoding];
// 处理数据,这里只在控制台输出信息
NSLog(@"服务器返回数据:%@",str);
// 清空数据
self.resData = nil;
}
#pragma mark 4. 服务器请求失败
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"网络请求错误:%@", error.localizedDescription);
}
IOS的POST方式网络请求
步骤:
1、确定NSURL资源
2、创建NSURLRequest网络请求
3、创建数据体,并向数据体封装数据
4、创建NSURLConnection连接请求
5、启动连接
代码:
//确定NSURL资源
NSString *urlString = [NSString stringWithFormat:@"http://www.baidu.com"];
NSURL *url = [NSURL URLWithString:urlString];
//建立NSURLRequest(POST)请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//1) 设置请求方式
[request setHTTPMethod:@"POST"];
//2) 创建数据体,并向数据体内封装数据(POST请求中创建数据体时,如果有中文,不需要转换,因为dataUsingEncoding已经实现了转码)
NSString *cards = @"AAA";
NSString *names = @"XXX";
NSString *bodyStr = [NSString stringWithFormat:@"封装数据一:%@&封装数据二:%@", cards, names];
//将NSString转换为NSData
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:body];
//建立NSURLConnection连接
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//启动连接
[conn start];
//实例化NSData准备从服务器接收数据
self.resData = [NSMutableData data];
NSURLConnection同步与异步请求
NSURLConnection还提供另外两种网络请求方式,一种是同步请求,一种是异步请求。用于不同的网络访问情况。
这两个方法分别是sendAsynchronousRequest和sendSynchronousRequest。
这里给出异步请求的代码:
// 异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *reponse, NSData *data, NSError *error) {
if (data != nil) {
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"服务器返回的数据为:%@", str);
} else if (data == nil && error == nil) {
NSLog(@"服务器返回数据为空");
} else {
NSLog(@"服务器连接错误,错误信息:%@", error.localizedDescription);
}
}];
关于这两个方法的详细使用可以参见IOS网络基础之JSON。