Richiesta non riuscita: tipo di contenuto inaccettabile: text / html utilizzando AFNetworking 2.0


205

Sto provando la nuova versione 2.0 di AFNetworking e visualizzo l'errore sopra. Qualche idea sul perché questo stia accadendo? Ecco il mio codice:

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

Sto usando Xcode 5.0.

Inoltre, ecco il messaggio di errore:

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}

Ho appena nascosto il JSON usando kJSONlink. Questo dovrebbe restituire un JSON.

Risposte:


361

Ciò significa che il tuo server sta inviando "text/html"invece i tipi già supportati. La mia soluzione era quella di aggiungere "text/html"al acceptableContentTypesset in AFURLResponseSerializationclasse. Basta cercare "ceptableContentTypes "e aggiungerlo @"text/html"manualmente al set.

Naturalmente, la soluzione ideale è cambiare il tipo inviato dal server, ma per questo dovrai parlare con il team del server.


142
Grazie! Ho appena aggiunto questo codice per farlo funzionare:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz,

13
Per PHP è facile come aggiungere questo alla pagina: header ("Content-Type: application / json"); (a meno che non sia una risposta JSON, quindi XML o qualcosa del genere)
rckehoe

1
@rckehoe Grazie per questo - ho preferito cambiare l'intestazione della pagina rispetto a acceptableContentTypes:)
Nick,

43
Un'alternativa al commento di @jaytrixz è semplicemente aggiungere un nuovo tipo di contenuto a quelli già esistenti:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia,

11
Codice Swift:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Husam,

178

Impostazione del mio RequestOperationManagerserializzatore di risposta per risolvere HTTPResponseSerializeril problema.

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

veloce

manager.responseSerializer = AFHTTPResponseSerializer()

Apportare questa modifica significa che non ho bisogno di aggiungere acceptableContentTypesad ogni richiesta che faccio.


2
L'ho fatto e si blocca la mia app. Ripristino dell'utilizzo diAFJSONResponseSerializer
jaytrixz

2
@jaytrixz Dipende, se il tuo server risponde sempre con JSON dovresti impostare responseSerializersu AFJSONResponseSerializer.
Danpe,

2
Ora riceverai responseObject come NSData e dovrai analizzare JSON nel blocco di successo.
Cameron Lowell Palmer,

1
Perché sto usando i pod, quindi in questo modo è meglio.
yong ho

@Danpe, Come convertire la riga di codice sopra in Swift. Ho provato con manager.responseSerializer = AFJSONResponseSerializer.serializer () ma non serve.
Ganesh Guturi,

72

Ho portato la risposta / commento di @ jaytrixz un ulteriore passo avanti e ho aggiunto "text / html" all'insieme di tipi esistente. In questo modo quando lo riparano sul lato server su "application / json" o "text / json", sostengo che funzionerà senza problemi.

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

2
Concordato. La risposta accettata a questa domanda ha un enorme difetto in quanto crea una bomba a orologeria che esploderà quando il lato server viene riparato per restituire il tipo di contenuto corretto.
Eric Goldberg,

Questo sembra giusto in teoria, ma qualcuno lo ha effettivamente testato?
Minimi

32

Sul lato server, ho aggiunto:

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

nel mio codice .php e anche questo ha risolto il problema.


3
if(!headers_sent() ) { header('Content-Type: application/json'); } È una bella soluzione
elliotrock

17

Risolvo questo problema da una prospettiva diversa.

Penso che se il server invia i dati JSON con l' Content-Type: text/htmlintestazione. Ciò non significa che il ragazzo del server abbia intenzione di inviarti un po 'di html ma accidentalmente cambiato in JSON. Significa che il ragazzo del server non si preoccupa di quale sia l' Content-Typeintestazione. Quindi, se al server non interessa il lato client, è meglio ignorare anche l' Content-Typeintestazione. Per ignorare il Content-Typecheck in dell'intestazioneAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

In questo modo AFJSONResponseSerializer(quello predefinito) serializzerà i dati JSON senza controllare l' Content-Typeintestazione della risposta.


Esatto Ignorando il tipo di contenuto non ricevo il mio contenuto come codice esadecimale, né come risposta nulla non riuscita. Funziona benissimo! Grazie
Brandon,

7

Un modo semplice per abilitare a ricevere il tipo di contenuto "text / plain":

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

Allo stesso modo se si desidera abilitare il tipo di contenuto "text / html":

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

5

Ho provato sotto la riga come da risposta @Andrie ma non ha funzionato,

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

così dopo aver cacciato di più, ho lavorato per farlo funzionare con successo.

Ecco il mio codice 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;

Spero che questo possa aiutare qualcuno là fuori.


1
+1. Questa è definitivamente la soluzione. Dal momento che è necessario impostare il tipo di contenuto accettabile sia sul serializzatore se si tratta di un serializzatore JSON (che normalmente utilizza "application / json") sia sull'operazione. In caso contrario, verranno visualizzate le impostazioni di errore solo durante il funzionamento.
Loretoparisi,

3

Questa è l'unica cosa che ho scoperto funzionare

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

Se qualcuno sta usando, AFHTTPSessionManagerallora si può fare così per risolvere il problema,

Ho sottoclassato AFHTTPSessionManagerdove sto facendo in questo modo,

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


1

Aggiungi questa riga:

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

0

Ho avuto in qualche modo un problema simile lavorando con AFNetworking da una base di codice Swift, quindi lo sto lasciando qui nel caso remoto qualcuno è sfortunato quanto me che devo lavorare in una configurazione del genere. Se lo sei, ti sento amico, resta forte!

L'operazione non è riuscita a causa di un "tipo di contenuto inaccettabile", nonostante io abbia impostato effettivamente acceptableContentTypescon aSet valore del tipo di contenuto in questione .

La soluzione per me è stata quella di modificare il codice Swift per renderlo più compatibile con Objective-C, immagino :

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

0

Una buona domanda ha sempre più risposte, per ridurre e aiutarti a scegliere la risposta giusta, qui aggiungo anche la mia. L'ho provato e funziona benissimo.

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);
 }];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.