AFNetworkingの最新版であるバージョン2.0を使って、FlickrのOAuthプロトコルを実装しようとしたら以下のようなエラーに遭遇しました。
Request failed: unacceptable content-type: text/plain
どうやらHTTPレスポンスのContent-Typeが text/plain
の場合に対応していない模様。
OAuth1.0のrequest_tokenのレスポンスは以下の様なフォーマットになっており、単純なテキストを返却してきます。
oauth_callback_confirmed=true&oauth_token=XXXXXXXXXX-XXXXXXXXXX&oauth_token_secret=XXXXXXXXXXX
解決方法
以下のようにText/Plain
を扱うAFHTTPTextResponseSerializer
クラスを定義したら問題なくエラー回避できました。
AFTextResponseSerializer.h
# import "AFURLResponseSerialization.h"
@interface AFTextResponseSerializer : AFHTTPResponseSerializer
@end
AFTextResponseSerializer.m
# import "AFTextResponseSerializer.h"
@implementation AFTextResponseSerializer
+ (instancetype)serializer {
AFTextResponseSerializer *serializer = [[self alloc] init];
return serializer;
}
- (instancetype)init {
self = [super init];
if (!self) {
return nil;
}
self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"text/plain", nil];
return self;
}
# pragma mark - AFURLResponseSerialization
- (id)responseObjectForResponse:(NSHTTPURLResponse *)response
data:(NSData *)data
error:(NSError *__autoreleasing *)error
{
if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) {
if ([(NSError *)(*error) code] == NSURLErrorCannotDecodeContentData) {
return nil;
}
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
@end
使い方
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// AFTextResponseSerializerをResponseSerializerに設定する。
AFTextResponseSerializer *textSerializer = [AFTextResponseSerializer serializer];
[manager setResponseSerializer:textSerializer];
[manager GET:baseUrl parameters:signedParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Response: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
2.0になって結構API変わってますが、相変わらずソースも読みやすいし、いろいろと勉強になるライブラリです。