ASIHTTPRequest的使用——框架使用

ASIHTTPRequest框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发。

 https://allseeing-i.com/ASIHTTPRequest

 https://github.com/pokeb/asi-http-request


ASIHTTPRequest具有如下优点:

1、支持下载数据入在内存或本地文件;

2、容易访问请求和应答HTTP或本地文件;

3、支持Cookie;

4、支持GZIP请求或应答;

5、支持缓存;

6、支持同步或异步请求;

7、支持HTTPS。


安装、配置ASIHTTPRequest框架

1、下载ASIHTTPRequest框架

下载地址:https://github.com/pokeb/asi-http-request/tree

2、添加ASIHTTPRequest文件

文件分别是:

ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
ASICacheDelegate.h
ASIDataCompressor.h
ASIDataCompressor.m
ASIDataDecompressor.h
ASIDataDecompressor.m
ASIDownloadCache.h
ASIDownloadCache.m
ASIFormDataRequest.h
ASIFormDataRequest.m
ASIHTTPRequest.h
ASIHTTPRequest.m
ASIHTTPRequestConfig.h
ASIHTTPRequestDelegate.h
ASIInputStream.h
ASIInputStream.m
ASINetworkQueue.h
ASINetworkQueue.m
ASIProgressDelegate.h
Reachability.h
Reachability.m

3、添加相关类库或框架

CFNetwork.framework
SystemConfiguration.framework
MobileCoreServices.framework
CoreGraphics.framework
libz.dylib

添加方法:点击左侧栏项目名称——再点击右侧出现的TARGET下的项目名称——选择Build Phases——选择Link Binary With Libraryes——点击“+”——在弹出框中选择所需框架——点击“Add”完成添加。

4、但ASIHTTPRequest框架不支持ARC,如果在ARC下开发必须进行相关的设置,即将ASIHTTPRequest框架的相关文件设置为“-fno-objc-arc”,以便支持ARC模式。

具体设置方法是:点击左侧栏项目名称——再点击右侧出现的TARGET下的项目名称——选择Build Phases——选择Compile Sources——选择ASIHTTPRequest相关文件,同时将“Compiler Flags”属性设置为“-fno-objc-arc”。


使用

在ASIHTTPRequest框架中与HTTP请求相关的类有ASIHTTPRequest和ASIFormDataRequest,其中最常用的是ASIHTTPRequest,而ASIFormDataRequest是ASIHTTPRequest的子类,ASIFormDataRequest可以发送类似于HTML中的表单数据,也可以上传数据,默认采用的是POST请求方法。也可以用其他的HTTP请求方法。

它们都可以进行同步或异步的请求。

1、实现GET同步请求

注意:使用ASIHTTPRequest类时,需引入头文件ASIHTTPRequest.h

#import "ASIHTTPRequest.h"
- (void)startRequest
{
    NSString *strURL= [[NSString alloc] initWithFormat:@"http://iosbook3.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@", @"<你的邮箱iosbook3.com用户邮箱>", @"JSON", @"query"];
    NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
    // 创建ASIHTTPRequest请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    // 同步请求
    [request startSynchronous];
    // 调用请求对象的error方法
    NSError *error = [request error];
    if (!error)
    {
        // 调用请求对象的responseData方法,获得从服务器应答回来的结果(如果返回是字符串,则使用responseString)
        NSData *date = [request responseData];
        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        
        NSLog(@"result %@", resDict);
    }
}

2、实现POST同步请求

注意:发送POST方法的请求时,不使用是同步还是异步都是使用ASIFormDataRequest类,需引入ASIFormDataRequest.h头文件。

#import "ASIFormDataRequest.h"
- (void)startRequest
{
    NSString *strURL = @"http://iosbook3.com/service/mynotes/webservice.php";
    NSURL *url = [NSURL URLWithString:[strURL URLEnodedString]];
    // 创建请求对象
    ASIFormDataRequest *request = [ ASIFormDataRequest requestWithURL:url];
    // 设置POST参数
    [request setPostValue:@"<你的iosbook3.com用户邮箱>" forKey:@"email"];
    [request setPostValue:@"JSON" forKey:@"type"];
    [request setPostValue:@"query" forKey:@"action"];
    // 发送同步请求
    [request startSynchronous];
    NSError *error = [request error];
    if (!error)
    {
        NSData *data = [request responseData];
        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        
        NSLog(@"result %@", resDict);
    }
}

特别说明:通过设置requestMehtod属性可以设置请求的方法,如GET,POST,PUT等,设置方法为:

[request setRequestMethod:@"PUT"];

3、异步请求

异步请求在用户体验方面要比同步请求好。因为同步请求过程中,只有同步请求完成后才能进行下一步的操作。而异步请求,则是在请求过程中还可能进行其他的操作,在异步请求完成或失败后,通过调用其代码委托方法实现需要的功能。

注意:使用时,除了引入ASIHTTPRequest.h头文件后,还需要设置协议ASIHTTPRequestDelegate。在使用过程中,可以使用框架自带的回调方法,也可使用自定义的回调方法,还可以使用代码块。

// 方法1 使用系统自带回调方法
- (void)startRequest
{
    NSString *strURL= [[NSString alloc] initWithFormat:@"http://iosbook3.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@", @"<你的邮箱iosbook3.com用户邮箱>", @"JSON", @"query"];
    NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
    // 创建ASIHTTPRequest请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    // 设置代理
    [request setDelegate:self];
    // 异步请求
    [request startAsynchronous];
}

// 回调方法(使用ASIHTTPRequest框架回调方法)
- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSData *data = [request responseData];
    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    NSLog(@"result %@", resDict);
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog:(@"%@", [error localizedDescription];
}

// 方法2 使用自定义回调方法
- (void)startRequest
{
    NSString *strURL= [[NSString alloc] initWithFormat:@"http://iosbook3.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@", @"<你的邮箱iosbook3.com用户邮箱>", @"JSON", @"query"];
    NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
    // 创建ASIHTTPRequest请求对象
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    // 设置代理
    [request setDelegate:self];
    // 不使用框架自带的回调方法时,可以自定义回调方法
    [request setDidFinishSelector:@selector(requestSuccess:)]; // 成功时
    [request setDidFailSelector:@selector(requestError:)]; // 失败时
    // 异步请求
    [request startAsynchronous];
}

// 回调方法(使用自定义回调方法)
- (void)requestSuccess:(ASIHTTPRequest *)request
{
    NSData *data = [request responseData];
    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    NSLog(@"result %@", resDict);
}

- (void)requestError:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog:(@"%@", [error localizedDescription];
}

// 方法3 使用代码块方法
// 注意:使用代码块的时候,要特别注意Retain Cycle,即死循环,所以要将对象设置标识符“__weak”(表示弱引用,针对ARC模式),或者是“__block”(针对MRC模式)
- (void)startRequest
{
    NSString *strURL= [[NSString alloc] initWithFormat:@"http://iosbook3.com/service/mynotes/webservice.php?email=%@&type=%@&action=%@", @"<你的邮箱iosbook3.com用户邮箱>", @"JSON", @"query"];
    NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
    // 创建ASIHTTPRequest请求对象
    __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    // 成功时的代码块
    [request setCompletionBlock:^{
        NSData *data = [request responseData];
        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
        
        NSLog(@"result %@", restrict);
    }];
    
    // 失败时的代码块
    [request setFailedBlock:^{
        NSError *error = [request error];
        NSLog:(@"%@", [error localizedDescription];
    }];
               
    // 异步请求
    [request startAsynchronous];
}
           
// 注意:在使用过程中,注意网络请求的处理
[request clearDelegatesAndCancel];
request.delegate = nil;


4、请求队列的应用

为了多线程的并发请求网络能力,ASIHTTPRequest被设计成为NSOperation子类。
ASINetworkQueue被设计成为NSOperationQueue子类。
NSOperation和NSOperationQueue是苹果Foundation框架提醒的,而ASIHTTPRequest和ASINetworkQueue是ASIHTTPRequest框架提供的。
NSOperationQueue队列可以由NSOperation或ASIHTTPRequest组成。
ASINetworkQueue也可以由NSOperation或ASIHTTPRequest组成。

如果NSOperationQueue是一个线程管理器,一个NSOperation相当于一个线程,它们被添加到NSOperationQueue队列中有序地执行。ASINetworkQueue和ASIHTTPRequest也是这样的概念,只是ASINetworkQueue线程管理器能够提供更多的网络相关的服务。

队列使用场景:从服务器同时下载两张图片并显示在主界面。
步骤1 引入相关头文件
ASIHTTPRequest.h
ASINetworkQueue.h
NSNumber+Message.h
NSString+URLEncoding.h
步骤2 属性定义
@property (weak, nonatomic) UIImageView *imageView1;
@property (weak, nonatomic) UIImageView *imageView2;
@property (strong, nonatomic) ASINetworkQueue *networkQueue;
步骤3 创建队列
- (void)setASINetworkQueue
{
    // 创建队列对象
    if (!self.networkQueue)
    {
        self.networkQueue = [[ASINetworkQueue alloc] init];
    }
    
    // 停止以前的队列
    [self.networkQueue cancelAllOperations];
    
    // 创建ASI队列
    // 设置对列代理
    [self.networkQueue setDelegate:self];
    // 设置请求成功回调方法
    [self.networkQueue setRequestDidFinishSelector:@selector(requestFinished:)];
    // 设置请求失败回调方法
    [self.networkQueue setRequestDidFailSelector:@selector(requestFailed:)];
    // 设置队列完成回调方法
    [self.networkQueue setQueueDidFinishSelector:@selector(queueFinished:)];
    
    for (int i = 0; i < 3; i++)
    {
        NSString *strURL = [NSString alloc] initWithFormat:@"http://iosbook3.com/service/download.php?email=%@&FileName=test%i.jpg", @"<你的iosbook3.com用户邮箱>", i];
        NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]];
        // 创建请求对象
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        // 设置请求对象tag值,对便于区分请求对象(还可以通过设置userInfo属性进行区分,即request.userInfo =[NSDictionary dictionaryWithObjectsAndKeys:@"番薯大佬", @"name", nil])
        request.tag = i;
        // 将请求对象加入到队列中
        self.networkQueue addOperation:request];
    }
    // 执行队列
    [self.networkQueue go];
}

// 回调方法
- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSData *data = [request responseData];
    NSError *error;
    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSOReadingAllowFragments error:&error];
    if (!resDict)
    {
        UIImage *image = [UIImage imageWithData:data];
        if (1 == request.tag)
        {
            self.imageView1.image = image;
        }
        else
        {
            self.imageView2.image = image;
        }
    }
    else
    {
        NSNumber *resultCodeObj = [resdict objectForKey:@"ResultCode"];
        NSString *errorStr = [resultCodeObj errorMessage];
        UIAlertView *alertView = [UIAlertView alloc] initWithTitle:@"错误信息” message:errorStr delegate:nil cancelButotnTitle:@"OK"otherButtonTitles:nil];
        [alertView show];
    }
    
    if (0 == [self.networkQueue requestsCount])
    {
        [self setNetworkQueue:nil];
    }
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@", [error localizedDescription];
          
    if (0 == [self.networkQueue requestsCount])
    {
        [self setNetworkQueue:nil];
    }
}
          
- (void)queueFinished:(ASIHTTPRequest *)request
{
    if (0 == [self.networkQueue requestsCount])
    {
        [self setNetworkQueue:nil];
    }
}


5、上传数据
通过ASIFormDataRequest实现上传。它相当于HTML的表单数据,默认是POST请求方法。

步骤1 引用头文件

#import "ASIFormDataRequest.h"

步骤2 设置协议

ASIHTTPRequestDelegate

步骤3 设置相关方法

- (void)setUpoad
{
    NSString *strURL = @"http://iosbook3.com/service/upload.php";
    NSURL *url1 = [NSURL URLWithString:[strURL URLEncodedString]];
    // 创建请求对象
    ASIFormDataRequest *request = [ASIFormDatRequest requestWithUrl:url1];
    // 提交数据使用setPostValue等方法
    [request setPostValue:@"<你的iosbook3.com用户邮箱>" forKey:@"email"];
    // 获取要上传的文件
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test1" ofType:@"jpg"];
    // 上传文件,相当于HTML表单中的上传控件
    [request setFile:path forKey:@"file"];
    // 设置代理
    [request setDelegate:self];
    // 重写协议方法
    [request setDidFinishSelector:@selector(requestSuccess:)];
    [request setDidFailSelector:@selector(requestError:)];
    // 请求开始
    [request startAsynchronous];
}

// 回调方法
- (void)requestSuccess:(ASIHTTPRequest *)request
{
    NSData *data = [request responseData];
    NSError *error;
    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    if (!resDict)
    {
        // do something
    }
    else
    {
        NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"];
        NSString *errorStr = [resultCodeObj errorMessage];
        UIAlertVIEW *alertView = [[UIAlertView alloc] intiWithTitle:@"错误信息" message:errorStr delegate:nilcancelButtonTtile:@"OK" otherButtonTitles:nil];
        [alertView show];
    }
}

- (void)requestError:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@", [error localizedDescription]);
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值