Requête POST avec AFNetworking 2.0 ne fonctionne pas, mais fonctionne dans testeur de requête HTTP

Je viens de commencer à utiliser la nouvelle API AFNetworking 2.0 qui utilise les versions précédentes depuis un moment déjà. J'essaye de faire une http POST request standard de tourbière, mais malheureusement je ne fais pas trop bien. Ceci est mon code actuel:

 AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"username" : self.usernameField.text, @"password" : self.passwordField.text}; [operationManager POST:@"https:URL GOES HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", [responseObject description]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

Maintenant, cela renvoie un JSON de (NULL) et ne me donne pas un code d'état comme 404 ou quelque chose (d'ailleurs comment pouvons-nous atteindre le code d'état lorsque vous utilisez AFN 2.0?). Cependant, lorsque j'essaie les informations avec une application web comme apikitchen.com qui teste la HTTP Post request pour moi, cela fonctionne quand je mets le nom d'user et le mot de passe dans le champ param . Donc, ma question est vraiment: pourquoi les parameters de la AFN 2.0 parameter property n'agissent-ils pas de la même manière que les parameters de l'application Web? Et plus généralement, pourquoi les post request parameters fonctionnent-ils pas pour moi dans AFN 2.0 ?

Merci pour l'aide à l'avance,
Mike

EDIT: Je suis aux sockets avec la mise en œuvre du correctif suggéré. La méthode My Post ressemble maintenant à ceci, mais cela n'a aucun sens pour moi maintenant.

 AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"username" : self.usernameField.text, @"password" : self.passwordField.text}; operationManager.requestSerializer.querySsortingngSerializationWithBlock = ^NSSsortingng*(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { NSSsortingng* encodedParams = form_urlencode_HTTP5_Parameters(parameters); return encodedParams; }; [operationManager POST:@"URL HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", [responseObject description]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

Maintenant, cela renvoie un JSON de (NULL) et ne me donne pas un code d'état comme 404 ou quelque chose (d'ailleurs comment pouvons-nous atteindre le code d'état lorsque vous utilisez AFN 2.0?).

Il devrait au less donner une erreur. Qu'est-ce que le gestionnaire d'échec imprime?

Donc, ma question est vraiment: pourquoi les parameters de la propriété de paramètre AFN 2.0 n'agissent-ils pas de la même manière que les parameters de l'application Web? Et plus généralement, pourquoi les parameters de post-traitement ne fonctionnent-ils pas pour moi dans AFN 2.0?

Après avoir examiné comment l'AFN (Version 2.0.1) code les parameters, il me semble que ceux-ci ne sont pas codés comme ils le devraient: L'algorithm de encoding application / x-www-form-urlencoded .

Jusqu'à ce que cela a été résolu, vous pouvez essayer la solution de contournement suivante. L'algorithm suivant code les parameters ssortingctement comme suggéré par w3c pour HTTP 5, au less pour Mac OS X 10.8 où je l'ai testé:

 static NSSsortingng* form_urlencode_HTTP5_Ssortingng(NSSsortingng* s) { CFSsortingngRef charactersToLeaveUnescaped = CFSTR(" "); CFSsortingngRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~"); NSSsortingng *result = CFBridgingRelease(CFURLCreateSsortingngByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFSsortingngRef)s, charactersToLeaveUnescaped, legalURLCharactersToBeEscaped, kCFSsortingngEncodingUTF8)); return [result ssortingngByReplacingOccurrencesOfSsortingng:@" " withSsortingng:@"+"]; } 

(Remarque: le code ci-dessus dépend des détails d'implémentation de la fonction CFURLCreateSsortingngByAddingPercentEscapes est tout à fait possible d'implémenter facilement l'algorithm suggéré sans aucune dépendance, ce que je reorderais – cela devient juste pas si court.)

 static NSSsortingng* form_urlencode_HTTP5_Parameters(NSDictionary* parameters) { NSMutableSsortingng* result = [[NSMutableSsortingng alloc] init]; BOOL isFirst = YES; for (NSSsortingng* name in parameters) { if (!isFirst) { [result appendSsortingng:@"&"]; } isFirst = NO; assert([name isKindOfClass:[NSSsortingng class]]); NSSsortingng* value = parameters[name]; assert([value isKindOfClass:[NSSsortingng class]]); NSSsortingng* encodedName = form_urlencode_HTTP5_Ssortingng(name); NSSsortingng* encodedValue = form_urlencode_HTTP5_Ssortingng(value); [result appendSsortingng:encodedName]; [result appendSsortingng:@"="]; [result appendSsortingng:encodedValue]; } return [result copy]; } 

Ensuite, lorsque vous utilisez l'AFN, vous pouvez personnaliser l'algorithm de serialization comme indiqué ci-dessous:

  AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; operationManager.requestSerializer.querySsortingngSerializationWithBlock = ^NSSsortingng*(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { NSSsortingng* encodedParams = form_urlencode_HTTP5_Parameters(parameters); return encodedParams; }; 

Mettez / après l'url. Je l'ai manqué pendant des heures.