Anforderung fehlgeschlagen: Inakzeptabler Inhaltstyp: Text / HTML mit AFNetworking 2.0

205

Ich probiere die neue Version 2.0 von AFNetworking aus und erhalte den obigen Fehler. Irgendeine Idee, warum das passiert? Hier ist mein Code:

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

Ich benutze Xcode 5.0.

Hier ist auch die Fehlermeldung:

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}

Ich habe den JSON nur mit kJSONlink versteckt. Dies sollte einen JSON zurückgeben.

jaytrixz
quelle

Antworten:

361

Dies bedeutet, dass Ihr Server "text/html"anstelle der bereits unterstützten Typen sendet . Meine Lösung bestand darin, "text/html"das acceptableContentTypesSet in der AFURLResponseSerializationKlasse hinzuzufügen . Suchen Sie einfach nach "acceptContentTypes" und fügen Sie @"text/html"das Set manuell hinzu.

Die ideale Lösung besteht natürlich darin, den vom Server gesendeten Typ zu ändern, aber dafür müssen Sie mit dem Serverteam sprechen.

Andrei Neag
quelle
142
Vielen Dank! Ich habe gerade diesen Code hinzugefügt, damit es funktioniert:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
Jaytrixz
13
Für PHP ist es so einfach, dies der Seite hinzuzufügen: header ("Content-Type: application / json"); (es sei denn, es ist keine JSON-Antwort, dann XML oder so)
rckehoe
1
@ rckehoe Danke dafür - viel lieber den Seitenkopf zu ändern als acceptableContentTypes:)
Nick
43
Eine Alternative zu @ jaytrixz Kommentar besteht darin, einfach einen neuen Inhaltstyp zu den bereits vorhandenen hinzuzufügen :op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia
11
Schneller Code:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam
178

Einstellen des RequestOperationManagerResponse Serializer, um HTTPResponseSerializerdas Problem zu beheben .

Ziel c

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Schnell

manager.responseSerializer = AFHTTPResponseSerializer()

Wenn ich diese Änderung acceptableContentTypesvornehme , muss ich nicht jeder Anfrage etwas hinzufügen .

Danpe
quelle
2
Ich habe das gemacht und es stürzt meine App ab. Zurück zur Verwendung vonAFJSONResponseSerializer
jaytrixz
2
@jaytrixz Es kommt darauf an, ob Ihr Server immer mit JSON antwortet, sollten Sie das responseSerializerauf setzen AFJSONResponseSerializer.
Danpe
2
Sie erhalten nun das responseObject als NSData und müssen den JSON im Erfolgsblock analysieren.
Cameron Lowell Palmer
1
Weil ich Pods benutze, ist dieser Weg besser.
Yong Ho
@ Danpe, So konvertieren Sie die obige Codezeile in Swift. Ich habe es mit manager.responseSerializer = AFJSONResponseSerializer.serializer () versucht, aber keine Verwendung.
Ganesh Guturi
72

Ich ging die Antwort / den Kommentar von @ jaytrixz noch einen Schritt weiter und fügte "text / html" zu den vorhandenen Typen hinzu. Auf diese Weise, wenn sie es auf der Serverseite auf "application / json" oder "text / json" korrigieren, behaupte ich, dass es nahtlos funktioniert.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mharper
quelle
2
Einverstanden. Die akzeptierte Antwort auf diese Frage weist einen großen Fehler auf, da sie eine Zeitbombe erzeugt, die explodiert, wenn die Serverseite repariert wird, um den richtigen Inhaltstyp zurückzugeben.
Eric Goldberg
Dies scheint theoretisch richtig zu sein, aber hat jemand dies tatsächlich getestet?
Minimi
32

Auf der Serverseite habe ich hinzugefügt:

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

in meinen .php-Code und dies hat auch das Problem behoben.

Chris Prince
quelle
3
if(!headers_sent() ) { header('Content-Type: application/json'); } Ist eine schöne Lösung
Elliotrock
17

Ich löse dieses Problem aus einer anderen Perspektive.

Ich denke, wenn der Server JSON-Daten mit Content-Type: text/htmlHeader sendet . Dies bedeutet nicht, dass der Server-Typ beabsichtigt hat, Ihnen HTML zu senden, sondern versehentlich in JSON geändert wurde. Es bedeutet, dass es dem Server-Typ einfach egal ist, was der Content-TypeHeader ist. Wenn es dem Server-Typ als Client-Seite egal ist, ignorieren Sie besser auch den Content-TypeHeader. Um den Content-TypeHeader zu ignorieren, checken Sie einAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

Auf diese Weise AFJSONResponseSerializerserialisiert der (Standard) die JSON-Daten, ohne den Antwortheader Content-Typeeinzuchecken.

dopcn
quelle
Genau richtig. Durch Ignorieren des Inhaltstyps erhalte ich meinen Inhalt weder als Hex-Code noch als fehlgeschlagene Null-Antwort. Das funktioniert super! Vielen Dank
Brandon
7

Eine einfache Möglichkeit, den Inhaltstyp "Text / Nur" zu empfangen:

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

Ebenso, wenn Sie den Inhaltstyp "text / html" aktivieren möchten:

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

Ich habe es unter der Zeile gemäß der Antwort von @Andrie versucht, aber es hat nicht funktioniert.

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

Nachdem ich mehr gejagt hatte, arbeitete ich daran, dass es erfolgreich funktionierte.

Hier ist mein Code-Snip.

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;

Hoffe, das wird jemandem da draußen helfen.

Abs
quelle
1
+1. Dies ist definitiv die Lösung. Da Sie den akzeptablen Inhaltstyp sowohl auf dem Serializer festlegen müssen, wenn es sich um einen JSON-Serializer handelt (der normalerweise "application / json" verwendet), als auch auf der Operation. Andernfalls erhalten Sie nur im Betrieb eine Fehlereinstellung.
Loretoparisi
3

Dies ist das einzige, was ich gefunden habe, um zu arbeiten

-(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);
    }];
}
Chrisallick
quelle
3

Wenn jemand verwendet, AFHTTPSessionManagerkann man dies tun, um das Problem zu lösen.

Ich habe untergeordnet, AFHTTPSessionManagerwo ich so mache,

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

In meinem Fall habe ich keine Kontrolle über die Servereinstellungen, aber ich weiß, dass "application / json" für "Content-Type" erwartet wird. Ich habe dies auf der iOS-Client-Seite getan:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

siehe AFNetworking Version 2 content-type Fehler

Uudaddy
quelle
1

Fügen Sie einfach diese Zeile hinzu:

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

Ich hatte ein ähnliches Problem bei der Arbeit mit AFNetworking aus einer Swift-Codebasis, also lasse ich dies hier im Remote-Fall, dass jemand so viel Pech hat wie ich, in einem solchen Setup arbeiten zu müssen. Wenn Sie sind, ich fühle Sie Kumpel, bleiben Sie stark!

Der Vorgang schlug aufgrund eines "inakzeptablen Inhaltstyps" fehl, obwohl ich den Wert tatsächlich acceptableContentTypesmit einem SetWert für den Inhaltstyp festgelegt habe.

Die Lösung für mich bestand darin, den Swift-Code so zu optimieren, dass er objektiv-C-freundlicher ist, denke ich :

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

Eine gute Frage hat immer mehrere Antworten, um sie zu reduzieren und Ihnen bei der Auswahl der richtigen Antwort zu helfen. Hier füge ich auch meine eigene hinzu. Ich habe es getestet und es funktioniert gut.

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