【问题标题】:AFNetworking 2.0 and authorizing the Imgur APIAFNetworking 2.0 和授权 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 的使用还很陌生,所以我真的很困惑我做错了什么。

【问题讨论】:

    标签: ios objective-c api afnetworking imgur


    【解决方案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)
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2023-03-23
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多