AFNetworking 2.0和授权Imgur API
Imgur的API要求只需查找关于图像的信息,只需使用API密钥授权您的应用程序即可,无需使用帐户或任何内容登录。
它说:
...您需要做的就是在您的请求中发送带有您的client_id的授权标头
这显然是这样的:
Authorization: Client-ID YOUR_CLIENT_ID
所以,我想这样做使用AFHTTPRequestOperationManager
,这似乎是替代AFHTTPClient
如下所示在AFNetworking 2.0:
AFHTTPRequestOperationManager * operationManager = [AFHTTPRequestOperationManager manager];
[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的使用很陌生,所以我很困惑我做错了什么。
编辑:
试试这个代码片段
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请求。
编辑:
您应该使用GET,而不是使用正在使用的API端点的POST
[[MRTImgurRequestOperationManager sharedManager] GET:@"path" parameters:params success:success failure:failure]];
在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");
}];
链接地址: http://www.djcxy.com/p/81437.html
上一篇: AFNetworking 2.0 and authorizing the Imgur API
下一篇: 403 error while getting data from Imgur api. Where am I going wrong?