Ios AF2.0和授权Imgur API

Ios AF2.0和授权Imgur API,ios,objective-c,api,afnetworking,imgur,Ios,Objective C,Api,Afnetworking,Imgur,要求只需查找有关图像的信息,您只需使用API密钥授权应用程序,无需使用帐户或任何东西登录 它说: …您只需在请求中发送一个带有客户端id的授权标头 看起来很像: 授权:客户ID您的客户ID 因此,我尝试使用AFHTTPRequestOperationManager,它似乎是AFNetworking 2.0中AFHTTPClient的替代品,如下所示: AFHTTPRequestOperationManager*operationManager=[AFHTTPRequestOperationMan

要求只需查找有关图像的信息,您只需使用API密钥授权应用程序,无需使用帐户或任何东西登录

它说:

…您只需在请求中发送一个带有客户端id的授权标头

看起来很像:

授权:客户ID您的客户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的使用非常陌生,所以我真的很困惑我做错了什么。

在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");
}];
编辑:

请尝试此代码段

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

这给了我一个错误:
NSLocalizedDescription=请求失败:禁止(403)
您确定输入的授权标头正确吗?我用我的客户ID进行了测试,效果很好。尝试以下操作:[self.requestSerializer setAuthorizationHeaderFieldWithToken:@“Client ID xxxx”]其中xxx将是您的客户端ID。如果我将我的客户端ID放入其他人的代码块中,它是否也可以工作?不可否认,我只是放弃了这一点,并计划在你的解决方案生效后实施它。是的,它应该会生效。它基本上在做同样的事情。上面的代码更面向对象,也更简洁。所以,如果你真的把这三个代码改成你的客户机ID,那么这个代码片段会对你有用,并返回“success”?我每次都会失败。好吧,我可能错过了一个非常重要的要点。您正在尝试从该API获取图像,对吗?那么你应该使用GET而不是POST。试试看。将图像发布到API时使用POST。而不是setAuthorizationHeaderFieldWithToken方法,而是执行[operationManager.requestSerializer setValue:@“Client ID--”forHTTPHeaderField:@“Authorization”]。这是我的错,我以为它会做同样的事情,显然它不会/