IT技术博客大学习 共学习 共进步

如何将TTURLRequest和OAuthConsumer搭配使用

某人的栖息地 2011-07-05 23:16:59 浏览 2,662 次

TTURLRequest是three20开发框架提供的一个url请求类,它是NSURLRequest类的扩展,有如下优点:

  • post数据方便,只需要构建一个参数的dictionary就可以了,像get方法一样简单
  • 支持磁盘缓存,而NSURLRequest仅支持内存缓存
  • 因为TTTableViewController + TTURLRequestModel的存在,搭配使用效果良好

在ios的开发中我有时也用到了OAuthConsumer进行oauth授权,利用OAuthConsumer的fetcher类请求远程数据,所以我想TTURLRequest和OAuthConsumer能不能搭配使用,这样就能用上three20相关便利方法加载远程数据。于是做了点简单的测试,果然成功了:)大体思路是:

  • 先利用OAuthConsumer根据提交的参数计算出oauth的Authorization认证头
  • 把Authorization头加到TTURLRequest
  • 由TTURLRequest提交数据。

直接上代码说话:

计算Authorization头

利用OAuthConsumer计算出Authorization头,为之后的请求做准备

//start 
OAConsumer * consumer = [[OAConsumer alloc] initWithKey:yourConsumerKey secret:yourSecret]; 
NSURL * url = [NSURL URLWithString:@"http://your-api-host/your-method"]; 
OAToken * authToken = [[OAToken alloc] initWithKey:yourAuthToken secret:yourAuthSecrent]; 
OAMutableURLRequest * request = [[OAMutableURLRequest alloc] initWithURL:url 
                                                                consumer:consumer 
                                                                   token:authToken 
                                                                   realm:nil 
                                                       signatureProvider:[[[OAPlaintextSignatureProvider alloc] init] autorelease]]; 
[request setHTTPMethod:@"POST"]; 
 
NSMutableArray * params = [NSMutableArray array]; 
OARequestParameter * p1 = [[OARequestParameter alloc] initWithName:@"param1" value:@"i'm param1"]; 
[params addObject:p1]; 
 
[request setParameters:params]; 
[request prepare]; 
 
TTDINFO(@"Authorization is %@", [request valueForHTTPHeaderField:@"Authorization"]);

使用TTURLRequest请求数据

将Authorization头附加到TTURLRequest,然后请求远程接口

TTURLRequest* req = [TTURLRequest requestWithURL:request.URL.absoluteString delegate:self]; 
req.response = [[[TTURLDataResponse alloc] init] autorelease]; 
req.httpMethod = @"POST"; 
req.cachePolicy = TTURLRequestCachePolicyNone; 
[req setValue:[request valueForHTTPHeaderField:@"Authorization"] forHTTPHeaderField:@"Authorization"]; 
[req send];

这个方法不需要对TTURLRequest进行修改,简单有效。

建议继续学习

  1. 基于PECL OAuth打造微博应用 (阅读 5,101)
  2. 深入理解OAuth与豆瓣OAuth test (阅读 4,945)
  3. 新浪微博OAuth认证流程分析 (阅读 4,921)
  4. PHP for Twitter OAuth 教学演示 (阅读 4,642)
  5. 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 (阅读 4,524)
  6. OAuth那些事儿 (阅读 4,163)
  7. OAuth 1.0a与1.0协议的改进… (阅读 3,802)
  8. 【社会化设计】自我(self)部分――授权 (阅读 3,642)
  9. 【社会化设计】自我(self)部分――密码反面模式(the Password Anti-pattern) (阅读 3,622)
  10. 新浪微博 Android SDK中OAuth2.0隐式授权部分的一个代码逻辑问题 (阅读 3,441)