LoginSignup
12
13

More than 5 years have passed since last update.

AFNetworking2.0でContent-Type: text/plainのレスポンスを扱う方法

Last updated at Posted at 2013-10-20

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変わってますが、相変わらずソースも読みやすいし、いろいろと勉強になるライブラリです。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13