AFNetworking 2.0并授权Imgur API

问题描述 投票:0回答:2

Imgur 的 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 使用还很陌生,所以我真的很困惑我做错了什么。

ios objective-c afnetworking imgur
2个回答
2
投票

编辑:

尝试这个代码片段

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]];

1
投票

在 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");
}];
© www.soinside.com 2019 - 2024. All rights reserved.