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 使用还很陌生,所以我真的很困惑我做错了什么。
编辑:
尝试这个代码片段
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]];
在 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");
}];