欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IOS与服务器交互POST 和 GET 博客分类: ios post get NSURLConnectionDelegate NSURLConnection 

程序员文章站 2024-03-15 16:45:12
...

背景介绍:
        当开发IOS应用时,IOS端会和服务器进行交互。IOS端会向服务器传送数据,如:登录功能,注册功能,发送用户填写信息到服务器等功能,都会用到POST方法。也会从服务器获取数据,就会用到GET方法。接下来,我来讲述一下IOS端与服务器的交互过程:

       当在某种需求下,我需要向服务器发送数据

NSURL *url = [NSURL URLWithString:@"http://xx/xx?user_id=xx&token=xx"];//设置请求的url
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";//POST请求
    request.timeoutInterval = 60;
    NSData *data = [NSJSONSerialization dataWithJSONObject:dic_test options:0 error:nil];//将发送数据转化成JSON(NSData类型)
    request.HTTPBody = data;
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//设置发送内容类型为 JSON
    NSURLConnection *connect = [NSURLConnection connectionWithRequest:request delegate:self];
    [connect start];
    [m_respond_data setLength:0];//设置接收POST结果的变量(NSMutableData类型)每次发送前先清空数据

 

           实现NSURLConnectionDelegate的代理方法

// 当服务端提供了有效的数据来创建NSURLResponse对象时,代理会收到connection:didReceiveResponse:消息。
// 这个代理方法会检查NSURLResponse对象并确认数据的content-type,MIME类型,文件 名和其它元数据。
// 需要注意的是,对于单个连接,我们可能会接多次收到connection:didReceiveResponse:消息;这咱情况发生在
// 响应是多重MIME编码的情况下。每次代理接收到connection:didReceiveResponse:时,应该重设进度标识
// 并丢弃之前接收到的数据。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
    NSLog(@"%@",[res allHeaderFields]);
}
//接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次,将返回的数据全部接收到一起
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [m_respond_data appendData:data];
}
//数据传完之后调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSDictionary *respond = [NSJSONSerialization JSONObjectWithData:m_respond_data options:NSJSONReadingMutableLeaves error:nil];
    //根据数据信息将界面作出相应的处理
    if ([[respond objectForKey:@"errcode"] isEqualToNumber:[NSNumber numberWithInt:0]])
    {
    }
}
//网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
-(void)connection:(NSURLConnection *)connection
 didFailWithError:(NSError *)error
{
    NSLog(@"%@",[error localizedDescription]);
}