仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1634|回复: 17
打印 上一主题 下一主题

[学习教程] ASP.NET网站制作之基于AFNetworking2.0和ReactiveCocoa2.1的iOS REST Client仓酷云

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。在开辟iOSApp时常常会碰到跟后端RESTAPI通讯的情形。这就触及到毛病处置,NSDictionary与Model的映照,用户登录与登出,权限考证,Archive/UnArchive,Copy,AccessToken过时处置等等,假如没有很好地处置这些点,就简单呈现代码庞大度增年夜,布局狼藉,不便利前期保护的征象。
恰好比来在看AFNetworking2.0和ReactiveCocoa2.1,参考了github的octokit,重写了花瓣的iOSRESTAPI,分享些心得。
基础布局
  1. |-HBPAPI.h|-Classes|-HBPAPIManager.h|-HBPAPIManager.m|-Models|-HBPObject.h|-HBPObject.m|-HBPUser.h|-HBPUser.m...
复制代码
利用时,间接援用HBPAPI.h便可,内里包括了一切的Class。由于利用了AFNetworking2.0,以是不再是HBPClient,而是HBPManager。HBPAPIManager包括了一切的跟服务端通讯的办法,经由过程Category来辨别。
  1. #pragmamark-HBPAPIManager(Private)@interfaceHBPAPIManager(Private)//外部一致利用这个办法来向服务端发送哀求////resultClass-从服务端猎取到JSON数据后,利用哪一个Class来将JSON转换为OC的Model//listKey-假如不指定,暗示前往的是一个object,如user,假如指定暗示前往的是一个数组,listKey就暗示这个列表的keyname,如{users:[]},那末listName就为user-(RACSignal*)requestWithMethod:(NSString*)methodrelativePath:(NSString*)relativePathparameters:(NSDictionary*)parametersresultClass:(Class)resultClasslistKey:(NSString*)listKey;@end#pragmamark-HBPAPIManager(User)@interfaceHBPAPIManager(User)//signal会senduser,假如没有user,就会sendError//必需以后用户已登录的情形下挪用-(RACSignal*)fetchUserInfo;//...@end#pragmamark-HBPAPIManager(Friendship)//...
复制代码
ModelsGroup包括了一切跟服务端API对应的Model,好比HBPComment
HBPComment.h
  1. #import"HBPObject.h"@classHBPUser;@interfaceHBPComment:HBPObject@property(nonatomic,assign)NSIntegercommentID;@property(nonatomic,copy)NSString*createdAt;@property(nonatomic,strong)HBPUser*user;//...@end
复制代码
HBPComment.m
  1. #import"HBPComment.h"@implementationHBPComment-(NSDictionary*)JSONKeysToPropertyKeys{return@{@"comment_id":@"commentID",@"user_id":@"userID",@"created_at":@"createdAt",//...};}@end
复制代码
Archive/UnArchive/Copy

每个Object都要撑持Archive/UnArchive/Copy,也就是要完成<NSCoding>和<NSCopying>协定,这两个协定的内容实在就是对Object的Property做些处置,以是假如能够在基类里把这些事都一致处置,就会便利很多。octokit利用Mantle来做这些事变,不外我以为Mantle仍是有些贫苦,因而写了个经由过程运转时来猎取property,并完成<NSCoding>和<NSCopying>的基类,只要两个大众办法:
  1. #import<Foundation/Foundation.h>@interfaceHBPObject:NSObject<NSCopying,NSCoding>//剖析API前往的JSON,前往对应的Model-(id)initWithDictionary:(NSDictionary*)JSON;//JSONkey到property的映照干系-(NSDictionary*)JSONKeysToPropertyKeys;@end
复制代码
个中-(id)initWithDictionary:(NSDictionary*)JSON的感化是遍历Object的Property,假如Property的Class是HBPObject,那末就挪用-(id)initWithDictionary:(NSDictionary*)JSO,否则就经由过程KVC的setValue:forKey:来设定值。
-(NSDictionary*)JSONKeysToPropertyKeys的内容也许是如许:
  1. -(NSDictionary*)JSONKeysToPropertyKeys{return@{@"id":@"ID",@"nav_link":@"navLink",};}
复制代码
如许经由过程一个HBPObject基类就完成了Archive/UnArchive/Copy。
用户的登录与登出

先来讲说登录,因为利用RAC,在机关API时,就不必要传进Block了,随之而来的一个成绩就是必要在正文中申明sendNext时会发送甚么内容。
  1. +(RACSignal*)signInUsingUsername:(NSString*)usernamepassowrd:(NSString*)password{NSAssert(API_CLIENT_ID&&API_CLIENT_SECRET,@"API_CLIENT_IDandAPI_CLIENT_SECRETmustbesetted");NSDictionary*parameters=@{@"grant_type":@"password",@"username":username,@"password":password,};HBPAPIManager*manager=[selfcreateManager];return[[managerfetchTokenWithParameters:parameters]setNameWithFormat:@"+signInUsingUsername:%@password:%@",username,password];}
复制代码
看着还挺复杂的吧,由于次要事情都是+fetchMoreData:parameters在做,看看它的完成
  1. -(RACSignal*)fetchTokenWithParameters:(NSDictionary*)parameters{return[[[[[[[selfrac_POST:@"oauth/access_token"parameters:parameters]//reduceEach的感化是传进多个参数,前往单个参数,是基于`map`的一种完成reduceEach:^id(AFHTTPRequestOperation*operation,NSDictionary*response){//拿到token后,就设置tokenproperty//setToken:办法会被触发,在那边会设置哀求的头信息,如Authorization。HBPAccessToken*token=[[HBPAccessTokenalloc]initWithDictionary:response];self.token=token;returnself;}]catch:^RACSignal*(NSError*error){//对Error举行处置,便利内部辨认NSIntegercode=error.code==-1001?HBPAPIManagerErrorConnectionFailed:HBPAPIManagerErrorAuthenticatedFailed;NSError*apiError=[[NSErroralloc]initWithDomain:HBPAPIManagerErrorDomaincode:codeuserInfo:nil];return[RACSignalerror:apiError];}]then:^RACSignal*{//统统一般的话,特地猎取用户信息return[selffetchUserInfo];}]doNext:^(HBPUser*user){//doNext相称于一个钩子,是在sendNext时会被实行的一段代码self.user=user;}]//把发送内容换成selfmapReplace:self]//制止sideeffectreplayLazily];}
复制代码
这里对signal举行了chain/modify/hook等操纵,次要感化是猎取accesstoken和用户信息。
用户的登出就复杂了,间接设置user和token为nil就好了。
设置超不时间弛缓存战略

由于AF2.0利用了新的架构,招致要设置Request的超时弛缓存略微有些贫苦,必要新建一个承继自AFHTTPRequestSerializer的Class
  1. @interfaceHBPAPIRequestSerializer:AFHTTPRequestSerializer@end@implementationHBPAPIRequestSerializer-(NSMutableURLRequest*)requestWithMethod:(NSString*)methodURLString:(NSString*)URLStringparameters:(NSDictionary*)parameters{NSMutableURLRequest*request=[superrequestWithMethod:methodURLString:URLStringparameters:parameters];request.timeoutInterval=10;request.cachePolicy=NSURLRequestReloadIgnoringLocalCacheData;returnrequest;}@end
复制代码
然后将这个class设置为manager.requestSerializer
  1. HBPAPIManager*manager=[[HBPAPIManageralloc]initWithBaseURL:[NSURLURLWithString:API_SERVER]];manager.requestSerializer=[HBPAPIRequestSerializerserializer];
复制代码
如许就好了
权限考证

这个对照复杂些,间接在办法内里加上判别
  1. #pragmamark-HBPAPIManager(Private)@interfaceHBPAPIManager(Private)//外部一致利用这个办法来向服务端发送哀求////resultClass-从服务端猎取到JSON数据后,利用哪一个Class来将JSON转换为OC的Model//listKey-假如不指定,暗示前往的是一个object,如user,假如指定暗示前往的是一个数组,listKey就暗示这个列表的keyname,如{users:[]},那末listName就为user-(RACSignal*)requestWithMethod:(NSString*)methodrelativePath:(NSString*)relativePathparameters:(NSDictionary*)parametersresultClass:(Class)resultClasslistKey:(NSString*)listKey;@end#pragmamark-HBPAPIManager(User)@interfaceHBPAPIManager(User)//signal会senduser,假如没有user,就会sendError//必需以后用户已登录的情形下挪用-(RACSignal*)fetchUserInfo;//...@end#pragmamark-HBPAPIManager(Friendship)//...0
复制代码
AccessToken过时的处置

AccessToken过时和猎取新的AccessToken能够交给利用者来做,可是会对照贫苦,最好的办法是过时后主动往猎取新的AccessToken,拿到Token后主动往实行之前失利的哀求,这块我是这么处置的
  1. #pragmamark-HBPAPIManager(Private)@interfaceHBPAPIManager(Private)//外部一致利用这个办法来向服务端发送哀求////resultClass-从服务端猎取到JSON数据后,利用哪一个Class来将JSON转换为OC的Model//listKey-假如不指定,暗示前往的是一个object,如user,假如指定暗示前往的是一个数组,listKey就暗示这个列表的keyname,如{users:[]},那末listName就为user-(RACSignal*)requestWithMethod:(NSString*)methodrelativePath:(NSString*)relativePathparameters:(NSDictionary*)parametersresultClass:(Class)resultClasslistKey:(NSString*)listKey;@end#pragmamark-HBPAPIManager(User)@interfaceHBPAPIManager(User)//signal会senduser,假如没有user,就会sendError//必需以后用户已登录的情形下挪用-(RACSignal*)fetchUserInfo;//...@end#pragmamark-HBPAPIManager(Friendship)//...1
复制代码
HBPObjectSubClass

那些承继自HBPObject的子类,有些事变是HBPObject没法处置的,好比NSArray的Property,由于Objective-C不撑持generic,以是没法晓得这个数组包括的事实是如何的Class,这时候就必要在子类对这些property做处置。
兄弟们,想来你们都看过了昨天的比赛了。我现在的痛苦状跟当时应该差不多。希望本版.net老师不吝赐教,为小弟这一批迷途的羊羔指一条阳光之道!您也知道:学习技术如果只有一个人摸索,那是一件多么痛苦的事情!还有,如果万辛能得名师或长者指点,那又是多么一件幸福和快乐的事情!
再见西城 该用户已被删除
沙发
 楼主| 发表于 2015-1-20 13:41:43 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
莫相离 该用户已被删除
板凳
发表于 2015-1-29 08:04:23 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
爱飞 该用户已被删除
地板
发表于 2015-2-5 04:42:59 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
透明 该用户已被删除
5#
发表于 2015-2-7 02:08:30 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
乐观 该用户已被删除
6#
发表于 2015-2-13 22:23:45 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
小女巫 该用户已被删除
7#
发表于 2015-2-16 10:21:15 | 只看该作者
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
精灵巫婆 该用户已被删除
8#
发表于 2015-2-16 22:17:38 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
灵魂腐蚀 该用户已被删除
9#
发表于 2015-2-17 18:41:48 | 只看该作者
逐步缩小出错代码段的范围,最终确定错误代码的位置。
不帅 该用户已被删除
10#
发表于 2015-2-18 17:07:45 | 只看该作者
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
小魔女 该用户已被删除
11#
发表于 2015-2-26 02:55:24 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
若相依 该用户已被删除
12#
发表于 2015-2-26 06:46:10 | 只看该作者
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
老尸 该用户已被删除
13#
发表于 2015-2-26 15:26:47 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
柔情似水 该用户已被删除
14#
发表于 2015-3-8 02:31:28 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
飘灵儿 该用户已被删除
15#
发表于 2015-3-8 15:39:07 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
深爱那片海 该用户已被删除
16#
发表于 2015-3-10 19:46:17 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
兰色精灵 该用户已被删除
17#
发表于 2015-3-17 09:11:24 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
第二个灵魂 该用户已被删除
18#
发表于 2015-3-24 05:43:07 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 18:06

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表