再见西城 发表于 2015-1-18 11:13:54

ASP.NET网站制作之基于AFNetworking2.0和ReactiveCocoa2.1的iOS REST Client仓酷云

其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。在开辟iOSApp时常常会碰到跟后端RESTAPI通讯的情形。这就触及到毛病处置,NSDictionary与Model的映照,用户登录与登出,权限考证,Archive/UnArchive,Copy,AccessToken过时处置等等,假如没有很好地处置这些点,就简单呈现代码庞大度增年夜,布局狼藉,不便利前期保护的征象。
恰好比来在看AFNetworking2.0和ReactiveCocoa2.1,参考了github的octokit,重写了花瓣的iOSRESTAPI,分享些心得。
基础布局

|-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来辨别。
#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
#import"HBPObject.h"@classHBPUser;@interfaceHBPComment:HBPObject@property(nonatomic,assign)NSIntegercommentID;@property(nonatomic,copy)NSString*createdAt;@property(nonatomic,strong)HBPUser*user;//...@endHBPComment.m
#import"HBPComment.h"@implementationHBPComment-(NSDictionary*)JSONKeysToPropertyKeys{return@{@"comment_id":@"commentID",@"user_id":@"userID",@"created_at":@"createdAt",//...};}@endArchive/UnArchive/Copy

每个Object都要撑持Archive/UnArchive/Copy,也就是要完成<NSCoding>和<NSCopying>协定,这两个协定的内容实在就是对Object的Property做些处置,以是假如能够在基类里把这些事都一致处置,就会便利很多。octokit利用Mantle来做这些事变,不外我以为Mantle仍是有些贫苦,因而写了个经由过程运转时来猎取property,并完成<NSCoding>和<NSCopying>的基类,只要两个大众办法:
#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的内容也许是如许:
-(NSDictionary*)JSONKeysToPropertyKeys{return@{@"id":@"ID",@"nav_link":@"navLink",};}如许经由过程一个HBPObject基类就完成了Archive/UnArchive/Copy。
用户的登录与登出

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

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

这个对照复杂些,间接在办法内里加上判别
#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)//...0AccessToken过时的处置

AccessToken过时和猎取新的AccessToken能够交给利用者来做,可是会对照贫苦,最好的办法是过时后主动往猎取新的AccessToken,拿到Token后主动往实行之前失利的哀求,这块我是这么处置的
#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)//...1HBPObjectSubClass

那些承继自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技术的结合。

透明 发表于 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的解决方案.

乐观 发表于 2015-2-13 22:23:45

最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。

小女巫 发表于 2015-2-16 10:21:15

主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。

精灵巫婆 发表于 2015-2-16 22:17:38

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

灵魂腐蚀 发表于 2015-2-17 18:41:48

逐步缩小出错代码段的范围,最终确定错误代码的位置。

不帅 发表于 2015-2-18 17:07:45

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

小魔女 发表于 2015-2-26 02:55:24

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

若相依 发表于 2015-2-26 06:46:10

碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。

老尸 发表于 2015-2-26 15:26:47

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

柔情似水 发表于 2015-3-8 02:31:28

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

飘灵儿 发表于 2015-3-8 15:39:07

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

深爱那片海 发表于 2015-3-10 19:46:17

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

兰色精灵 发表于 2015-3-17 09:11:24

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

第二个灵魂 发表于 2015-3-24 05:43:07

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
页: [1]
查看完整版本: ASP.NET网站制作之基于AFNetworking2.0和ReactiveCocoa2.1的iOS REST Client仓酷云