zoukankan      html  css  js  c++  java
  • ASI简单实现网络编程

      使用iOS SDK中的HTTP网络请求API,相当的复杂,调用比較麻烦。ASIHTTPRequest 对CFNetwork API进行了封装。而且使用起来非常easy的一套API,在非常多比較老旧的项目依旧存在,因此大家仍然须要熟悉ASI的使用。以下我们一起学习研究一下ASI的简单使用。

    一、环境搭建

    1、首先下载asi包,而且引入以下文件:http://allseeing-i.com/ASIHTTPRequest/ 

    2、添加框架

    二、用法

      1、发送同步GET请求,直接调用startSynchronous方法就可以。以下的服务地址自己能够自己搭建,发送请求后调用请求的responseData属性便获取到返回的数据:

    - (void)sync{
        NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/logo.php?userName=jereh&pwd=123"];
        ASIHTTPRequest * requst=[[ASIHTTPRequest alloc] initWithURL:url];
     //设置超时时间
        requst.timeOutSeconds=3;
        
        //发送同步请求
        [requst startSynchronous];
        
        if(requst.error){
            NSLog(@"请求出错了,%@",requst.error);
        }else {
            NSData * data=requst.responseData;
            NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"%@",dic);
        }
    
    }

      2、发送异步GET请求。直接调用startAsynchronous方法就可以,异步和同步稍有不同。使用代理接受数据

    - (void)async{
        dataResult=[NSMutableData data]; 
        NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/logo.php?userName=jereh&pwd=123"];
        ASIHTTPRequest * requst=[[ASIHTTPRequest alloc] initWithURL:url];
        self.request=requst;
        requst.timeOutSeconds=3;
        requst.delegate=self;
        [requst startAsynchronous];
        
    }
    
    //開始发送请求
    - (void)requestStarted:(ASIHTTPRequest *)request{
    }
    //失败的时候调用
    - (void)requestFailed:(ASIHTTPRequest *)request{
     NSLog(@"===requestFailed");
    }
    //接收数据调用。假设文件过大分多次调用,此处须要拼接返回的data
    - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
        [dataResult appendData:data];
    }
    //请求结束后解析数据
    - (void)requestFinished:(ASIHTTPRequest *)request{
        NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:dataResult options:NSJSONReadingMutableContainers error:nil];
        
    }

      3、使用块来实现异步GET请求,由于当面对多个请求的时候採用代理的方式略微显得有点麻烦。比方在拼接数据的时候须要推断当前是哪个请求,然后依据请求对象地址来确定採取哪种拼接,所以,在处理多个请求的时候用块比較有优势

    - (void) asyncFormBlock{
        
        NSURL *url=[NSURL URLWithString:@"http://192.168.2.162/loginPost.php"];
        
        ASIFormDataRequest * request=[ASIFormDataRequest requestWithURL:url];
        
        //设置请求參数
        [request setPostValue:@"jereh" forKey:@"userName"];
        [request setPostValue:@"123" forKey:@"pwd"];
        [request startAsynchronous];
        
        //请求完毕后解析数据
        [request setCompletionBlock:^{
            NSDictionary * dic=[NSJSONSerialization JSONObjectWithData:dataResult options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"%@",dic);
        }];
        
        //開始接收的时候调用
        [request setDataReceivedBlock:^(NSData *data) {
            [dataResult appendData:data];
        }];
        
        //失败的时候调用
        [request setFailedBlock:^{
            
        }];
        
    }

      4、同步Post请求的实现,Post请求和get不同,这里须要拼接条件。并且这次用到的类也略微不同ASIFormDataRequest,除此之外基本类似。代码例如以下:

    ASIFormDataRequest * request=[ASIFormDataRequest requestWithURL:url];
    
        //设置请求參数
        [request setPostValue:@"jereh" forKey:@"userName"];
        [request setPostValue:@"123" forKey:@"pwd"];
        request.timeOutSeconds=3;
        
        [request startSynchronous];

      5、异步的Post请求我就不用说了吧?相信大家能写出来

      6、下载,在涉及到网络的时候必定涉及到网络的下载和上传。ASI对文件的下载封装的很好,我们用起来很的简单。以下我们通过一个进度条显示下载进度,效果图例如以下:

     

    - (void)asyncDowload{
    
        NSURL * url=[NSURL URLWithString:@"http://192.168.1.107/test.rar"];
        ASIHTTPRequest * request=[ASIHTTPRequest requestWithURL:url];
     NSString * path=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    path=[path stringByAppendingPathComponent:@"test.rar"];
      //设置下载路径
        request.downloadDestinationPath=path;
        //支持断点续传
        request.allowResumeForFileDownloads=YES;
        //设置下载代理。将代理设置为progress对象就可以
        request.downloadProgressDelegate=circle;
        [request startAsynchronous];
    }

      7、文件的上传和下载类似,可是须要注意的事情是,上传须要往server发送东西。既然须要向server传递东西就涉及到POST,用get的方式是直接获取的,没法传值因此,上传须要用到类ASIFormDataRequest。操作和上面讲到的Post提交类似,只是这里注意的是,既然须要传递东西。就要调用传递东西的方法就可以。

    在这里我们有三个方法

    1 直接设置文件,其它默认

    [request setFile:path forKey:@"file"];

    2 设置文件,同一时候设置目的文件名和类型

    [request setFile:path withFileName:@"asiImg1.png" andContentType:@"image/png" forKey:@"file"];

    3 设置二进制文件,同一时候设置目的文件名和类型

    [request setData:data withFileName:@"t.png" andContentType:@"image/png" forKey:@"file"];

      想要了解很多其它内容的小伙伴,能够点击查看源代码,亲自执行測试。

      疑问咨询或技术交流,请增加官方QQ群:JRedu技术交流 (452379712)

    作者:杰瑞教育
    出处:http://blog.csdn.net/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接。否则保留追究法律责任的权利。
     
  • 相关阅读:
    Freemaker Replace函数的正则表达式运用
    [Android]使用Spring for Android改善数据交互流程
    [Freemarker]自定义时间戳函数
    [jquery.validate]自定义方法实现"手机号码或者固定电话"的逻辑验证
    [Javascript]网页链接加上时间戳防止串用户
    支付系统设计
    java设计模式-抽象工厂模式
    IDEA解决maven多module出现多root的问题
    java设计模式-工厂方法模式
    java设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5124250.html
Copyright © 2011-2022 走看看