HTTP操作之ASIHTTPRequest

转载只为自己阅读方便,绝无他心,原文地址:

http://blog.csdn.net/ryantang03/article/details/7856348

出自我很尊重的小伙 唐韧_Ryan


ASIHTTPRequest是一个第三方开源项目,在现在的IOS应用中多使用到这个开源类库来提供网络操作,相比于SDK提供的网络操作类库,ASIHTTPRequest使用上更加方便、效率更高,同时功能也非常强大。这是ASIHttpRequest的官网:http://allseeing-i.com/ASIHTTPRequest/


以下是官方对ASIHttpRequest的解释:

What is ASIHTTPRequest?

ASIHTTPRequest is an easy to use wrapper around the CFNetwork API that makes some of the more tedious aspects of communicating with web servers easier. It is written in Objective-C and works in both Mac OS X and iPhone applications.

It is suitable performing basic HTTP requests and interacting with REST-based services (GET / POST / PUT / DELETE). The included ASIFormDataRequest subclass makes it easy to submit POST data and files usingmultipart/form-data.


ASIHTTPRequest是在SDK的API中CFNetwork之上封装的一个开源类库,使复杂的网络处理变得简单,ASIHTTPRequest用OC开发,适用于Mac OS X和IOS平台开发。另外它还支持表单数据提交,适合与基于HTTP的REST架构的服务进行交互(使用GET、POST、PUT请求方式)。


1.在项目中集成ASIHTTPRequest

首先到官网上下载项目包,解压后可以看到项目的文件结构如下:


然后就是把该项目添加到我们自己的项目当中,直接将这个文件夹拖拽到我们自己项目的根目录下就可以了,选择拷贝文件到项目选项,然后是添加 一些框架,有CFNetwork.framework,SystemConfiguration.framework,MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib(IOS5中为libz.1.2.5.dylib),最后将这些框架拖拽到Framwork文件夹中就可以了,这样就完成了集成ASIHTTPRequest的过程。下面看下工程目录结构:


如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这个链接中所说的方法http://blog.csdn.net/iangelfalls/article/details/7102844,另外可能会遇到头文件<GHUnitIOS/GHUnit.h>找不到的情况,如果遇到这种问题,将ASIHTTPRequest目录中的Tests目录删除即可,Tests目录下的文件是用GHUnit框架写的一个测试用例,正式使用中不需要用到。


2.使用ASIHTTPRequest进行网络操作

首先,在需要使用该类库的文件中引入头文件

#import "ASIHTTPRequest.h"


然后编写执行网络请求操作的代码:

[cpp]  view plain copy
  1. - (IBAction)startAsycRequest:(id)sender {  
  2.       
  3.     NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];  
  4.       
  5.     __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  6.       
  7.     //使用OC中新增的bolck语法(块语法),可以实现并行编程  
  8.     //以下方法是在请求完成后会被调用的块  
  9.     [request setCompletionBlock:^{  
  10.         //获取请求返回结果  
  11.         NSString *response = [request responseString];  
  12.         NSLog(@"%@",response);  
  13.         //如果是数据集,可以使用以下方式返回结果  
  14. //        NSData *responseData = [request responseData];  
  15.           
  16.     }];  
  17.       
  18.     //如果请求失败,可以在这里进行处理  
  19.     [request setFailedBlock:^{  
  20. //        NSError *error = [request error];  
  21.   
  22.     }];  
  23.       
  24.     //开启一个异步请求(这里只说明了异步请求的使用,因为一般情况下的网络请求都采用异步的方式,否则会阻塞UI)  
  25.     [request startAsynchronous];  
  26. }  

执行后打印出来的结果是一个网页的完成HTML信息:

利用ASIHTTPRequest也可以向服务器提交请求参数,今天就做一个登录的例子,客户端发送XML请求,然后得到服务端的响应,响应的结果是返回XML字符串。直接上代码吧,代码中有详细注释。

首先在.h文件中做如下声明:

[cpp]  view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController  
  4.   
  5. @property (retain,nonatomic) UIActivityIndicatorView *indicator;  
  6. @property (retain, nonatomic) IBOutlet UITextField *userNameTextField;  
  7. @property (retain, nonatomic) IBOutlet UITextField *passwordTextField;  
  8.   
  9. - (IBAction)login:(id)sender;  
  10.   
  11. @end  

然后是.m实现文件(这里只列出了主要代码部分):

[cpp]  view plain copy
  1. //使用异步请求并更新UI  
  2. - (IBAction)login:(id)sender {  
  3.     //弹出加载提示框  
  4.     [self showToast:@"正在登陆..."];  
  5.       
  6.     /*执行登陆请求 
  7.      服务端为跑在Tomcat上的一个Servelet 
  8.      请求方式采用xml,格式如下: 
  9.      <Document> 
  10.         <User id ="xxx"  password=”xxx”/> 
  11.      </Document> 
  12.      请求结果返回一个XML字符串,这里的服务器地址我省略了,因为用的是以前一个项目的服务器,这里没法公开 
  13.      */  
  14.     __block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://xxx/server/Login"]];  
  15.       
  16.     //构建可变字符串请求  
  17.     NSMutableString *requestXML = [[NSMutableString alloc] init];  
  18.     [requestXML appendString:@"<Document>"];  
  19.     [requestXML appendString:@"<User id=\""];  
  20.     [requestXML appendString:self.userNameTextField.text];  
  21.     [requestXML appendString:@"\" "];  
  22.     [requestXML appendString:@"password=\""];  
  23.     [requestXML appendString:self.passwordTextField.text];  
  24.     [requestXML appendString:@"\"/>"];  
  25.     [requestXML appendString:@"</Document>"];  
  26.       
  27.     //将NSString类型转换成NSData类型,后面的参数为编码类型,这里是UTF-8  
  28.     NSData *requestData = [requestXML dataUsingEncoding:NSUTF8StringEncoding];  
  29.   
  30.     //使用ASIHTTPRequest中的自定义请求参数的方法  
  31.     [request appendPostData:requestData];  
  32.     //设置请求方式  
  33.     [request setRequestMethod:@"POST"];  
  34.       
  35.     //请求执行完会调用block中的代码  
  36.     [request setCompletionBlock:^{  
  37.         NSLog(@"Success");  
  38.         NSLog(@"%@",[request responseString]);  
  39.           
  40.         [self.indicator stopAnimating];  
  41.         [alertView dismissWithClickedButtonIndex:0 animated:YES];  
  42.         [self.indicator release];  
  43.         [alertView release];  
  44.     }];  
  45.       
  46.     //如果出现异常会执行block中的代码  
  47.     [request setFailedBlock:^{  
  48.         NSLog(@"Failed");  
  49.         [self.indicator stopAnimating];  
  50.         [alertView dismissWithClickedButtonIndex:0 animated:YES];  
  51.         [self.indicator release];  
  52.         [alertView release];  
  53.     }];  
  54.   
  55.     [request startAsynchronous];  
  56.       
  57.     [request release];  
  58.       
  59. }  
  60.   
  61. //构建自定义弹出提示框  
  62. -(void)showToast:(NSString*) message  
  63. {  
  64.     alertView = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self  cancelButtonTitle:nil otherButtonTitles:nil, nil];  
  65.     [alertView setBackgroundColor:[UIColor clearColor]];  
  66.     //必须在这里调用show方法,否则indicator不在UIAlerView里面  
  67.     [alertView show];  
  68.       
  69.     self.indicator = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];  
  70.     self.indicator.center = CGPointMake(alertView.bounds.size.width/2, alertView.bounds.size.height-40);  
  71.       
  72.     //停止时隐藏indicator  
  73.     self.indicator.hidesWhenStopped = YES;  
  74.       
  75.     //将UIActivityIndicator作为子控件放在UIAlertView当中  
  76.     [alertView addSubview:self.indicator];  
  77.     [self.indicator startAnimating];  
  78.       
  79. }  

下面看看运行效果和服务器的返回信息:

                                 

点击登录后,可以在控制台看到服务器返回的登录结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值