AFNetworking 2.0 和授权 Imgur API
Posted
技术标签:
【中文标题】AFNetworking 2.0 和授权 Imgur API【英文标题】:AFNetworking 2.0 and authorizing the Imgur API 【发布时间】:2013-12-03 05:38:22 【问题描述】:Imgur's API 要求您只需使用您的 API 密钥授权您的应用程序,就可以简单地查找有关图像的信息,而无需使用帐户或任何东西登录。
上面写着:
...您需要做的就是在您的请求中发送带有您的 client_id 的授权标头
显然看起来像:
Authorization: Client-ID YOUR_CLIENT_ID
所以我尝试使用AFHTTPRequestOperationManager
执行此操作,这似乎是AFNetworking 2.0 中AFHTTPClient
的替代品,如下所示:
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager 管理器];
[operationManager POST:@"https://api.imgur.com/3/image/1Nf1quS" parameters:@@"Authorization": @"Client-ID ---" success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"success");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"failure");
];
基本上是尝试发送带有授权信息的请求(我为这篇文章删除了我的 ID)。然而,它一直给出“失败”作为响应。
所以我尝试使用credential
属性,但NSURLCredential
似乎基于用户名和密码,而我没有这些,因为我只需要我的客户 ID。
所以我又尝试了一种完全不同的方法:
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
NSMutableURLRequest *request= [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.imgur.com/3/image/1Nf1quS"]];
[request addValue:@"Client-ID ---" forHTTPHeaderField:@"Authorization"];
[operationManager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"success");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"fail");
];
这次使用授权的东西作为请求的值。但是这个实际上从来没有记录过任何东西。
我对 API 的使用还很陌生,所以我真的很困惑我做错了什么。
【问题讨论】:
【参考方案1】:编辑:
试试这个代码sn-p
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"Client-ID ---" forHTTPHeaderField:@"Authorization"];
[operationManager GET:@"https://api.imgur.com/3/image/1Nf1quS" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"success");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"failure");
];
我不了解 Imgur API,但是对于处理标头和其他内容,如果您只是对 API 进行一些请求,您可以在请求操作之前添加标头。但是,如果您需要在多个地方进行 API 调用,我认为子类化 AFHTTPRequestOperationManager 会是一种更好的处理方式。
例如,您可以创建一个名为 MRTImgurRequestOperationManager 的子类:
@interface MRTImgurRequestOperationManager : AFHTTPRequestOperationManager
+ (MRTImgurRequestOperationManager*)sharedManager;
@end
然后在你的实现文件中:
+ (MRTImgurRequestOperationManager*)sharedManager
static MRTImgurRequestOperationManager *_sharedManager;
static dispatch_once_t _dispatchOnceToken;
dispatch_once(&_dispatchOnceToken, ^
NSURL *baseURL = [NSURL URLWithString:@"API_URL_HERE"];
_sharedManager = [[MRTImgurRequestOperationManager alloc] initWithBaseURL:baseURL];
);
return _sharedManager;
- (id)initWithBaseURL:(NSURL*)url
self = [super initWithBaseURL:url];
if (self)
// Add headers or other options here
// For example
[self.requestSerializer setValue:@"VALUE" forHTTPHeaderField:@"HEADER_NAME"];
return self;
这样,您可以添加/删除 HTTP 标头,而无需在几个地方更改您的代码。这也可能有助于测试。
所以要使用它,你会:
#import "MRTImgurRequestOperationManager.h"
然后向共享经理提出您的 Imgur 请求。
编辑:
您应该对正在使用的 API 端点使用 GET,而不是 POST
[[MRTImgurRequestOperationManager sharedManager] GET:@"path" parameters:params success:success failure:failure]];
【讨论】:
您确定您输入的授权标头正确吗?我用我的客户 ID 进行了测试,它工作正常。试试这个: [self.requestSerializer setAuthorizationHeaderFieldWithToken:@"Client-ID xxxx"] 其中 xxx 将是您的客户端 ID。 如果我将我的客户 ID 放在其他人的代码块中,它是否也可以工作?诚然,我只是放弃了这一点,并计划在你的解决方案工作后实施它。 是的,它应该可以工作。它基本上是在做同样的事情。上面的代码更加面向对象和干净。 因此,如果您只是将三个 --- 更改为 您的 客户端 ID,那么这个 sn-p 将为您工作并返回“成功”? gist.github.com/anonymous/a890190b6d9985398140我每次都失败。 好吧,我可能错过了一个非常重要的点。您正在尝试从该 API 获取图像,对吗?那么你应该使用 GET 而不是 POST。试试看。将图像发布到 API 时使用 POST。而不是 setAuthorizationHeaderFieldWithToken 方法做 [operationManager.requestSerializer setValue:@"Client-ID ---" forHTTPHeaderField:@"Authorization"]; .这是我的错,我认为它会做同样的事情,显然它没有/【参考方案2】:在 AFNetworking 2.0 中,您可以设置标题字段。通过使用AFHTTPRequestSerializer
中的方法
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
试试这样的:
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"Client-ID ---" forHTTPHeaderField:@"Authorization"];
[operationManager POST:@"https://api.imgur.com/3/image/1Nf1quS" parameters:@@"Authorization": @"Client-ID ---" success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"success");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"failure");
];
【讨论】:
这给了我这个错误:NSLocalizedDescription=Request failed: forbidden (403)
以上是关于AFNetworking 2.0 和授权 Imgur API的主要内容,如果未能解决你的问题,请参考以下文章