现在的位置: 首页 > 综合 > 正文

网络之ASIHttpRequest和SBJson简单使用 .

2018年02月14日 ⁄ 综合 ⁄ 共 7241字 ⁄ 字号 评论关闭

http://blog.csdn.net/nono_love_lilith/article/details/7648731原文

这边简单的说下常用的第三方网络库以及,以及json数据协议格式的简单使用。

先引入目前网上点击率最高的关于这个使用的文章(源文不详,呵呵)

ASIHTTPRequest类库简介和使用说明

我只是简单说下一般项目中会用到的最基础一部分,有的东西都是用着用着就熟了,犯不着一开始记住那么多,然后没有实践都会慢慢忘掉,

我比较喜欢先简单看下,在头脑中形成一个类似于一个索引目录,不知道细节没关系,我们有了索引就可以去查阅资料嘛。

先准备下ASIHttpRequest的一些下载和添加。

1.下载地址,我是在github上下的,地址https://github.com/pokeb/asi-http-request/

2.然后吧源文件拖进去项目,添加:CFNetwork.framework,.framework, MobileCoreServices.framework,CoreGraphics.framework和libz.1.2.3.dylib。上面文章都有介绍。

然后我们简单看下一个最简单的异步请求。

包含一个url地址,一个request,一个delegate。

  1. @implementation NLNetHelper  
  2.   
  3. + (void)startRequesWithContent:(NSObject *)model delegte :delegte  
  4. {  
  5.     //step 1: 根据code判断是佛要3des加密
      
  6.     NSString *code = [model getMethidCode];  
  7.     NSLog(@"code是!!!!!!%@",code);  
  8.     if (code == @"10000") {  
  9.           
  10.     }  
  11.       
  12.     //step 2:head和body组装成jsonString
      
  13.     NLHead *head = [[NLHead alloc] init];  
  14.    // head    
  15.       
  16.   //  NSString *urlString = [NSString stringWithFormat:@"%@%@.do",baseURL,code];
      
  17.     NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];  
  18.     ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];  
  19.     [request setPostBody:nil];  
  20.     [request setDelegate:delegte];  
  21.     [request startAsynchronous];  
  22.   
  23.         //step1. 模型解析   
  24. }  

代码直接项目中测试类拷贝的,主要看下面的4-5句。

因为在Android编写习惯性会把我们自己的网络处理类封装在一起。

但是ios中看了很多demo,发现请求参数处理以及request以及response返回的处理都在ViewController中处理~

一眼看上去是方便多了,不用定义一些类似于bean类型的类来管理我们要设置进去一些属性值,用于最后转化成请求参数在网络层处理,

而是很直接的手动拼装起来。

因为这第一个项目,也不知道ios有木有这样的习惯,就是ViewController类中基本处理了当前页面的所有逻辑操作~因为看过一个我们外包版本的项目

一个ViewController代码2,3千行~~

好了,我的意思是有需要的可以自己书写一个netManager,parseHelper等等的类。

在Android中异步的操作一般子线程然后handler来处理。

ios暂时没接触多线程这块。异步的请求,对于返回以及何时返回,返回错误,用了代理这方法。

因为我们都知道异步的这个概念,直白点就是,MainThread新起一个SubThread,子线程处理完东西后,一是用所谓的Handler神马的机制来通知主线程,

或者是经典的的回调函数嘛。而代理类,协议啊接口,正式有部分这样的性质不是么?

  1. @optional  
  2.   
  3. // These are the default delegate methods for request status
      
  4. // You can use different ones by setting didStartSelector / didFinishSelector / didFailSelector
      
  5. - (void)requestStarted:(ASIHTTPRequest *)request;  
  6. - (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;  
  7. - (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;  
  8. - (void)requestFinished:(ASIHTTPRequest *)request;  
  9. - (void)requestFailed:(ASIHTTPRequest *)request;  
  10. - (void)requestRedirected:(ASIHTTPRequest *)request;  
  11.   
  12. // When a delegate implements this method, it is expected to process all incoming data itself
      
  13. // This means that responseData / responseString / downloadDestinationPath etc are ignored
      
  14. // You can have the request call a different method by setting didReceiveDataSelector
      
  15. - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;  
  16.   
  17. // If a delegate implements one of these, it will be asked to supply credentials when none are available
      
  18. // The delegate can then either restart the request ([request retryUsingSuppliedCredentials]) once credentials have been set
      
  19. // or cancel it ([request cancelAuthentication])
      
  20. - (void)authenticationNeededForRequest:(ASIHTTPRequest *)request;  
  21. - (void)proxyAuthenticationNeededForRequest:(ASIHTTPRequest *)request;  

以上就是所有的可选的带了方法,看意思就明白。

好了,以上只是ASIHttpRequest中部分的功能,基本就能解决我们一般网络类应用中大部分的功能了吧。

二:SBJson使用

虽然现在看到说sdk5.0以上,已经集成了json解析库。同时貌似说性能还高,但是,可能我们的现在的应用还要兼容下5.0以下的版本。

反正这些都是需要我们客观看待然后主观舍取。

SBJSon同样的一个第三方包

1.下载地址 https://github.com/stig/json-framework

我们都知道,json的格式就是key value。

说白了json格式就是一种带着特性的String字窜。

我们把我们要的数据组装成这样的字窜床底给服务端,然后服务端返回同样这样字窜的数据,我们要解析然后提取出内容来。

看过java我们都知道,其实里面是map的遍历。

同样的,在ios,我们需要先定义一个字典,然后把需要传递的数据以键值对存入,然后调用json解析器生成jsonString。

同样,也会有个反序列化咯。

[dictionary JSONRepresentation]; 字典生成jsonString。

 NSMutableDictionary *dic = [jsonString JSONValue]; jsonString转化成字典

其实相对于ios上的,java中其实封装的更加完美。能直接操作javabean-》jsonString。

因为用了反射,后来查了下,貌似ios也是有反射这内容啊~

为什么说bean—>jsonString呢。

因为,大部分,比如我们一个用户登陆通信,我们会设计一个LoginBean,包含两个字段 username和password,然后是setter,getter方法。

当然,不用bean,直接在ViewCotroller中把name啊password设置如dic中,因为我看了几个demo版本都这样~,甚至我们外包的那个项目也是这么搞。

好了,反正简单来说。

数据转化,如果使用了类似于bean的自定义类,那么bean—》dic—>jsonString。反解析时同样。

因此我的处理是:

  1. -(NSString *)bean2jsonString{  
  2.     NSMutableDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:  
  3.              partnerCode, @"partnerCode",  
  4.              version, @"version",  
  5.              prov,@"prov",  
  6.              mobile,@"moblie",  
  7.              methodId,@"methodId",  
  8.              userId,@"useId",  
  9.              [NSDictionary dictionaryWithObjectsAndKeys:postTime, @"postTime",md5Sign,@"md5Sign",nil],@"other",  
  10.             nil];  
  11.     return [dictionary JSONRepresentation];  
  12. }  
  13.   
  14. - (void)jsonString2Bean:(NSString *)jsonString  
  15. {  
  16.     NSMutableDictionary *dic = [jsonString JSONValue];  
  17.     NSString *partnerCodeString = [NSString stringWithFormat:@"修改过的%@",[dic objectForKey:@"partnerCode"]];  
  18.     [self setPartnerCode:partnerCodeString];  
  19.     }  

该方法是在bean中。反正觉得没有Android中json用起来方便,你扔个标准bean对象,就给你出来一个jsonString。

其实也是很简单的两块内容,刚做了,记录下。下面准备调通下加密这块,分享和借鉴

抱歉!评论已关闭.