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?