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的主要内容,如果未能解决你的问题,请参考以下文章

设置身份验证。令牌头 AFNetworking 2.0

AFNetworking 2.0 和请求标头

AFNetworking 2.0 和单元测试

Xcode 5 和 AFNetworking 2.0?

AFNetworking 2.0 和响应序列化选项

AFNetworking 2.0 图片上传和 JSON 返回错误