网络基础

来源:互联网 发布:淘宝卖家查看店铺粉丝 编辑:程序博客网 时间:2024/04/27 07:36

一:网络请求之GET vs POST

有两种方法把数据提交给服务器:GETPOST


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 = [NSStringstringWithFormat:@"%@?username=%@&password=%@",LOGIN_URL, _userNameText.text,_passwordText.text];


// 注意:网络请求的URL,需要编码才可以使用!!!

NSURL *url = [NSURLURLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


// 定义请求

NSURLRequest*request = [NSURLRequestrequestWithURL:url];


// 定义连接

NSURLConnection*conn = [[NSURLConnectionalloc]initWithRequest:requestdelegate:self];


// 开始访问

[connstart];


#warning - 2.获得服务器数据的准备工作

@interfaceViewController :UIViewController <NSURLConnectionDataDelegate>

@interfaceViewController ()

{

         //接收返回数据方法会被调用多次,需要定义成员变量记录接收到的数据

      NSMutableData   *_receivedData;

}

- (IBAction)getLogin:(id)sender

{

       //初始化接收数据

         _receivedData = [NSMutableDatadata];

         ……

}


#warning - 3.通过NSURLConnectionDataDelegate代理方法接收数据


//收到服务器返回数据,本方法会被调用多次

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data

{

   NSLog(@"收到服务器返回数据%@",data);

   [_receivedDataappendData: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 = [NSMutableDatadata];

// 定义URL,字母及数字组成的url不需要编码

NSURL *url = [NSURLURLWithString:LOGIN_URL];

// 定义请求

NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:url];

// 等待服务器响应的最长时间

[request setTimeoutInterval:5.0];

// 设置请求方法,大小写无关

[request setHTTPMethod:@"post"];

NSString *bodyString = [NSStringstringWithFormat:@”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);

}


其他方法无需做任何更改!





0 0