一:网络请求之GET vs POST
有两种方法把数据提交给服务器:GET和POST
1.GET:
1> GET的语义是获取指定URL上的资源
2> 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
3> 不安全,因为在传输过程中,数据被放在请求的URL中
4> 传输的数据量小,这主要是因为受URL长度限制
2.POST:
1> POST的语意是对指定资源“追加/添加”数据
2> 将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
3> 所有数据对用户来说不可见
4> 可以传输大量数据,上传文件只能使用Post
二:网络访问的四个步骤:
第一步:确定地址-URL
第二步:建立请求
第三步:建立并启动连接
等待网络处理中...
第四步:连接完成,处理结果
三:IOS网络处理常用类
1. NSURL(地址)
请求地址
2. NSURLRequest(请求,GET请求使用)
保存需要传送给Web服务器的全部数据:
一个NSURL对象
缓存策略
等待Web服务器响应的最长时间
请求头
请求体
3. NSMutableURLRequest(可变请求,POST请求使用)
NSURLRequest的可修改子类
4. NSURLConnection(连接)
负责创建客户端和Web服务器之间的网络连接、发送NSURLRequest对象中的数据并收集来自服务器的响应
四:NSURLConnectionDataDelegate的常用代理方法
之所以使用代理方法,是因为要处理请求返回的结果!
// 服务器开始返回数据
- (void)connection:didReceiveResponse:
// 收到服务器返回的数据,本方法会被调用多次
- (void)connection:didReceiveData:
// 数据接收完毕,做数据的最后处理
- (void)connectionDidFinishLoading:
// 网络连接错误
- (void)connection:didFailWithError:
// 发送数据给服务器,POST 请求使用此方法
- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:
五:GET请求步骤——地址->请求->连接
//定义URL
NSString *urlStr = @"http://xxx.com/login.php?username=123&password=123";
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
//定义Request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//定义Connection
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
//启动Connection
[conn start];
六:POST请求步骤(定义/启动Connection部分省略)
//定义URL
NSString *urlStr = @"http://xxx.com/login.php";
//定义Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 等待服务器响应的最长时间
[request setTimeoutInterval:5.0];
// 设置请求方法,大小写无关
[request setHTTPMethod:@"post"];
NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userNameText.text,_passwordText.text];
// 生成请求体数据并编码
NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
// 设置HTTP请求数据体
[request setHTTPBody:body];
七:GET & POST请求演练
1.GET
#warning - 1.GET请求操作代码
// 定义URL
NSString *urlStr = [NSString stringWithFormat:@"%@?username=%@&password=%@", LOGIN_URL, _userNameText.text, _passwordText.text];
// 注意:网络请求的URL,需要编码才可以使用!!!
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// 定义请求
NSURLRequest*request = [NSURLRequest requestWithURL:url];
// 定义连接
NSURLConnection*conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
// 开始访问
[conn start];
#warning - 2.获得服务器数据的准备工作
@interfaceViewController : UIViewController <NSURLConnectionDataDelegate>
@interface ViewController ()
{
// 接收返回数据方法会被调用多次,需要定义成员变量记录接收到的数据
NSMutableData *_receivedData;
}
- (IBAction)getLogin:(id)sender
{
// 初始化接收数据
_receivedData = [NSMutableData data];
……
}
#warning - 3.通过NSURLConnectionDataDelegate代理方法接收数据
// 收到服务器返回数据,本方法会被调用多次
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
NSLog(@"收到服务器返回数据%@",data);
[_receivedData appendData:data];
}
// 数据接收结束
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{
NSString*string = [[NSString alloc]initWithData:_receivedDataencoding:NSUTF8StringEncoding];
NSLog(@"接收完毕,返回内容为:%@",string);
//释放数据
_receivedData = nil;
}
// 网络连接错误
- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
//取消对URL的编码即可发生错误。
NSLog(@"网络连接错误:%@", error.localizedDescription);
}
2.POST
#warning - 1.POST请求操作代码
// 初始化接收数据
_receivedData = [NSMutableData data];
// 定义URL,字母及数字组成的url不需要编码
NSURL *url = [NSURL URLWithString:LOGIN_URL];
// 定义请求
NSMutableURLRequest*request = [NSMutableURLRequest requestWithURL:url];
// 等待服务器响应的最长时间
[request setTimeoutInterval:5.0];
// 设置请求方法,大小写无关
[request setHTTPMethod:@"post"];
NSString *bodyString = [NSString stringWithFormat:@”username=%@&password=%@", _userNameText.text, _passwordText.text];
// 生成请求体数据并编码
NSData*body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
// 设置HTTP请求数据体,NSMutableURLRequest会自动在请求头中加入Content-Length
[requestsetHTTPBody:body];
// 定义连接
……
#warning - 2.NSURLConnectionDataDelegate代理方法
// 发送数据给服务器,POST请求(上传操作)会使用此方法
- (void)connection:(NSURLConnection*)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
NSLog(@“发送数据给服务器bytesWritten:%d, totalBytesWritten %dtotalBytesExpectedToWrite %d”, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}
其他方法无需做任何更改!