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.

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.


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 .


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

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.


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.


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

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.


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

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;

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


1

Fügen Sie einfach diese Zeile hinzu:

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

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>

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

-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);
 }];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.