web-dev-qa-db-ja.com

失敗した要求:受けられないcontent-type:AFNetworking 2.0を使用しているtext / html

AFNetworkingの新しいバージョン2.0を試していますが、上記のエラーが発生します。なぜこれが起こっているのですか?これが私のコードです:

    NSURL *URL = [NSURL URLWithString:kJSONlink];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializer];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [[NSOperationQueue mainQueue] addOperation:op];

私はXcode 5.0を使っています。

また、これはエラーメッセージです:

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xda35180> { URL: kJSONlink } { status code: 200, headers {
    Connection = "Keep-Alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 2898;
    "Content-Type" = "text/html";
    Date = "Tue, 01 Oct 2013 10:59:45 GMT";
    "Keep-Alive" = "timeout=5, max=100";
    Server = Apache;
    Vary = "Accept-Encoding";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}

KJSONlinkを使ってJSONを隠しただけです。これはJSONを返すはずです。

199
jaytrixz

これはあなたのサーバーが既にサポートされている型の代わりに"text/html"を送っていることを意味します。私の解決策はacceptableContentTypesクラスのAFURLResponseSerializationセットに"text/html"を追加することでした。 「acceptableContentTypes」を検索して、手動でセットに@"text/html"を追加するだけです。

もちろん、理想的な解決策はサーバーから送信されるタイプを変更することですが、そのためにはサーバーチームと話をする必要があります。

357
Andrei Neag

RequestOperationManager Response SerializerをHTTPResponseSerializerに設定することで問題は解決しました。

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

スウィフト

manager.responseSerializer = AFHTTPResponseSerializer()

この変更を加えることで、リクエストごとにacceptableContentTypesを追加する必要がなくなります。

178
Danpe

@ jaytrixzの答え/コメントをもう一歩進めて、既存のタイプのセットに "text/html"を追加しました。そのように彼らがサーバ側でそれを "application/json"または "text/json"に修正するとき、私はそれがシームレスに働くと主張します。

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
71
mharper

サーバー側で、私は追加しました:

header('Content-type: application/json');

私の.phpコードに、これも問題を修正しました。

32
Chris Prince

私はこの問題を別の観点から解決します。

サーバーがJSONデータをContent-Type: text/htmlヘッダー付きで送信するかどうかを考えます。それはサーバーの男があなたにいくつかのHTMLを送信することを意図していたが誤ってJSONに変更されたという意味ではありません。これは、サーバの人がContent-Typeヘッダが何であるかを気にしないということです。そのため、サーバーの人がクライアント側を気にしないのであれば、Content-Typeヘッダーも無視したほうがよいでしょう。 Content-Typeヘッダーを無視するにはAFNetworkingのチェックイン

manager.responseSerializer.acceptableContentTypes = nil;

このようにして、AFJSONResponseSerializer(デフォルト)はレスポンスヘッダのContent-TypeをチェックせずにJSONデータをシリアル化します。

17
dopcn

"text/plain"コンテンツタイプを受け取ることを可能にする簡単な方法:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

同様に、 "text/html"コンテンツタイプを有効にしたい場合は、

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
7
da Rocha Pires

@Andrieの回答に従って以下の行を試してみましたが、うまくいきませんでした、

op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

それで、もっと狩りをした後、私はそれがうまく動くようにするために回避しました。

これが私のコードの断片です。

AFHTTPRequestOperationManager *operation = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializer];

    NSMutableSet *jsonAcceptableContentTypes = [NSMutableSet setWithSet:jsonResponseSerializer.acceptableContentTypes];
    [jsonAcceptableContentTypes addObject:@"text/plain"];
    jsonResponseSerializer.acceptableContentTypes = jsonAcceptableContentTypes;
    operation.responseSerializer = jsonResponseSerializer;

これが誰かに役立つことを願っています。

5
ABS

これが私が働くことがわかった唯一のものです

-(void) testHTTPS {
    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
    [securityPolicy setAllowInvalidCertificates:YES];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager setSecurityPolicy:securityPolicy];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager GET:[NSString stringWithFormat:@"%@", Host] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"%@", string);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}
3
chrisallick

誰かがAFHTTPSessionManagerを使っているならば、問題を解決するためにこのようにすることができます、

私はこのようにしているところでAFHTTPSessionManagerをサブクラス化しました、

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;
3
Hemang

私の場合、サーバー設定を制御することはできませんが、 "Content-Type"に "application/json"を期待していることはわかっています。私はiOSクライアント側でこれをしました:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

AFNetworkingバージョン2のコンテンツタイプエラーを参照してください

2
uudaddy

この行を追加するだけです:

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
1
Elangovan

良い質問には常に正しい答えを選択するのを減らして助けるために複数の答えがあります。私はそれをテストしました、そしてそれはうまく働きます。

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.yourdomain.com/appname/data/ws/index.php/user/login/"]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:@"POST" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *json = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"%@", json);
    //Now convert json string to dictionary.
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error.localizedDescription);
}];
0
Hemang

私はSwiftのコードベースからAFNetworkingを使っているときにどういうわけか同様の問題を抱えていたので、私はただ遠く離れた場合にこれをここに残しておきます。 あなたがそうであれば、私はあなたがバディだと感じ、強いままでいなさい!

問題のコンテンツタイプの値を含むacceptableContentTypesを実際にSetに設定したにもかかわらず、操作が「受け入れられないcontent-type」のため失敗しました。

私にとっての解決策は、SwiftコードをよりObjective-Cに優しくなるように微調整することでした。私は推測します

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>
0
mokagio