リクエストに失敗しました:許可されないコンテンツタイプ:AFNetworking 2.0を使用したtext / html


205

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を返すはずです。

回答:


361

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

もちろん、理想的なソリューションはサーバーから送信されるタイプを変更することですが、そのためにはサーバーチームと話し合う必要があります。


142
ありがとう!これを機能させるためにこのコードを追加しました:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz

13
PHPの場合、これをページに追加するのと同じくらい簡単です。header( "Content-Type:application / json"); (JSONレスポンスでない場合を除き、XMLまたは何か)
rckehoe

1
@rckehoeありがとうございます。ページのヘッダーを変更することをお勧めしますacceptableContentTypes:)
Nick

43
@jaytrixzコメントする代わりに、ちょうどすることです追加し、既存のものに新しいコンテンツタイプを:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia

11
Swiftコード:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam

178

RequestOperationManager応答シリアライザを設定してHTTPResponseSerializer問題を修正しました。

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

迅速

manager.responseSerializer = AFHTTPResponseSerializer()

この変更を行うと、行うacceptableContentTypesすべてのリクエストに追加する必要がなくなります。


2
これを作成すると、アプリがクラッシュします。使用に戻すAFJSONResponseSerializer
jaytrixz 2013年

2
@jaytrixz場合によっては、サーバーが常にJSONで応答する場合は、responseSerializerをに設定する必要がありAFJSONResponseSerializerます。
Danpe 2013年

2
これで、responseObjectをNSDataとして受け取り、成功ブロックでJSONを解析する必要があります。
Cameron Lowell Palmer

1
私はポッドを使用しているので、この方法の方が優れています。
ヨンホ2014年

@Danpe、上記のコード行をSwiftに変換する方法。manager.responseSerializer = AFJSONResponseSerializer.serializer()で試しましたが、使い物になりませんでした。
Ganesh Guturi 2015

72

@jaytrixzの回答/コメントをさらに一歩進め、既存のタイプのセットに「text / html」を追加しました。サーバー側で「application / json」または「text / json」に修正すると、シームレスに機能するようになります。

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

2
同意した。この質問に対する受け入れられた回答には、サーバー側が正しいコンテンツタイプを返すように修正されたときに爆発する時限爆弾を作成するという大きな欠陥があります。
Eric Goldberg

これは理論的には正しいようですが、実際にテストした人はいますか?
Minimi

32

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

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

私の.phpコードにこれを追加すると、問題も修正されました。


3
if(!headers_sent() ) { header('Content-Type: application/json'); } 良い修正です
elliotrock 2015

17

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

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

manager.responseSerializer.acceptableContentTypes = nil;

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


正解です。コンテンツタイプを無視すると、16進コードとしても、失敗したnil応答としてもコンテンツを受け取りません。これはうまくいきます!ありがとう
ブランドン

7

「text / plain」コンテンツタイプを受信できるようにする簡単な方法:

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

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

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

5

私は@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;

これが誰かを助けることを願っています。


1
+1。これが決定的な解決策です。これがJSONシリアライザ(通常は「application / json」を使用している)である場合、シリアライザと操作の両方で、許容可能なコンテンツタイプを設定する必要があるため。そうしないと、操作時のみエラー設定が表示されます。
loretoparisi 2015

3

これは私が機能することがわかった唯一のものです

-(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

誰かが使用している場合AFHTTPSessionManager、問題を解決するためにこのようにすることができます、

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

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


1

この行を追加してください:

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

0

私はSwiftコードベースからAFNetworkingを操作する際に、どういうわけか似たような問題があったので、リモートケースでこれをそのままにしておきます。もしそうなら、私はあなたが仲間だと感じて、強く滞在してください!

操作は、私が実際に設定したものの、「容認できないコンテンツタイプ」に失敗したacceptableContentTypesSet問題になっているコンテンツタイプの値を含みます。

私にとっての解決策は、SwiftコードをよりObjective-Cに対応するように調整することだったと思います。

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

0

良い質問には常に複数の答えがあり、削減して正しい答えを選択するのに役立ちます。ここにも私が追加します。私はそれをテストしました、そしてそれはうまく働きます。

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

-1
 UIImage *image = [UIImage imageNamed:@"decline_clicked.png"];
NSData *imageData = UIImageJPEGRepresentation(image,1);


NSString *queryStringss = [NSString stringWithFormat:@"http://119.9.77.121/lets_chat/index.php/webservices/uploadfile/"];
queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[MBProgressHUD showHUDAddedTo:self.view animated:YES];


[manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
 {


     [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"];



 }
      success:^(AFHTTPRequestOperation *operation, id responseObject)
 {



    NSDictionary *dict = [responseObject objectForKey:@"Result"];

    NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];


 }
      failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
     NSLog(@"Error: %@ ***** %@", operation.responseString, error);
 }];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.