8
votes

Afnetworking 500 Corps de réponse

J'utilise Afnetworking 2.0 dans mon application. J'ai remarqué que si mon service Web renvoie un code de 500 status, je ne reçois pas le corps de la réponse.

Voici un exemple de mon code PHP p> xxx pré>

Si j'utilise un simple client de repos, il s'agit d'un exemple d'organisme de réponse. P> xxx pré>

Cependant, cela semble être la seule réponse que je puisse obtenir de l'Afnetworking P> XXX PRE>

Ceci est la partie de mon code de mon objectif-C qui fait cela. p> xxx pré>

est là pour que je puisse obtenir le corps de réponse? p>

EDIT: Plus de code de clarification P>

ci-dessous fait partie de ma sous-classe d'AFHTTPSessionManager P>

-(void)searchForItemWithString:(NSString *)searchString withCompletionBlock:(arrayBlock)block {

    self.inventorySearchBlock = block;

    NSDictionary *parameters = @{@"query": searchString};

    [[MSMAMobileAPIClient sharedClient] GET:@"inventory/search" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {

        if (!responseObject) {
            NSLog(@"Error parsing JSON");
        } else {
            //do stuff with the json dictionary that's returned..
        }

    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        NSLog(@"Error: %@",error.description);

    }];

}


0 commentaires

3 Réponses :


0
votes

Vous devez utiliser AfcomPoundSerializer pour indiquer à la structure Afnetwork Comment traiter toutes les réponses possibles qu'elle pourrait recevoir. Par défaut, il n'essaiera que de cartographier JSON. Un sérialiseur composé fonctionnera à travers les sérialiseurs jusqu'à ce qu'il trouve une erreur qui ne pose pas une erreur.


vous souhaitez utiliser: xxx

sur AFCOMPONDRESPONSERIALIZERALISÉE (IN AFURLRESPONSÉSERIALIATION.H ).

Vous devez transmettre une gamme de sérialisateurs pouvant gérer la réponse. L'un des sérialiseurs de la matrice doit être une instance de AFHTTPRESSEérialiseur pour gérer vos réponses d'erreur.


7 commentaires

Y a-t-il un tutoriel de cela quelque part?


Page Afnetworking GitHubing Page (en particulier, le Guide de la migration) est l'endroit où aller.


J'ai ajouté un exemple de ma sous-classe AfhttpessessionManager. Ai-je configuré l'AfcomPoundSérialiseur de manière incorrecte?


K j'ai changé à cette auto.Responsesérializer = [AfcombapoundresponseSerializerializerImizerImizerIlizeWithResponsesArsialiseurs: @ [[[AFJSONRESPONSES SERIALISANT ERIALIZER], [AFHTTTPRESPONSESÉSERIALISANT SERIALISANT]]]; et mis à jour ma question pour refléter cela, mais le bloc d'échec est toujours appelé avec le même résultat :(


Comment configurez-vous le client et démarrez-vous la demande au serveur? Est-ce que c'est en train d'utiliser votre sous-classe? Pourquoi avez-vous besoin de la sous-classe?


Je l'utilise essentiellement pour que je n'ai pas à régler les paramètres de sécurité et l'URL de base à chaque fois. Il rend mes classes de bibliothécaires plus simples à lire. J'ai posté un exemple de méthode de l'une de mes classes "bibliothécaire".


On dirait que vous aurez besoin de faire un petit débogage pour savoir si / comment votre sérialisateur composé est utilisé



14
votes

Mise à jour: j'ai créé un référentiel GitHub pour contenir le dernier code que j'utilise. Tous les changements seront postés là-bas. https://github.com/hackmodford/hmfjsonresponsesérializerwithdata

La réponse provient de ce problème sur Github. https://github.com/afnetworking/afnetworking/issues/1397

gfiumara est le dev qui est venu avec ça. Je n'ai que légèrement modifié sa sous-classe d'AfjsonResponsesérializer pour inclure une chaîne réelle au lieu de la nsdata xxx


xxx

Voici un exemple de comment Je l'utilise dans le bloc d'échec. xxx


4 commentaires

N'oubliez pas que la définition d'une valeur de nil à userinfo [jsonresponseseserializerwithdatake] lancera une exception. Pour contourner cela, utilisez KVC. SetValue: Forey: teste la valeur d'abord pour voir si elle est nil . Si c'est le cas, il traite l'instruction comme si vous aviez appelé RevealObjectForkey: à la place - ce qui ne fera que sans rien si l'objet n'est pas là.


@James vous suggérez-vous cela à la place? [userInfo SetValue: [[[Nstring Alloc] InitwithData: Encodage des données: Nsutf8Stringencoding] Forey: JSONRESPONSEAREALIZEROvithaity];


Pour ceux qui en ont besoin pour être sur un nsdictionnaire et non seulement sur une simple chaîne. Il suffit de désérialiser les données comme celle ci-dessous. NSDictionary * D = [NSJSONSONSERIALISATION JSONOBJETWITHDATA: Options de données: NsjsonReadingMutablecontainers Erreur: Erreur];


@Hakmodford Avez-vous vérifié que votre méthode est appelée? Le ! Self.Error enregistrement ResponsibleObject empêche cette méthode d'être appelée !!! (AFHTTPEQUESTOPERATION.M)



0
votes

Si vous incluez ma catégorie dans votre projet, c'est aussi simple que les suivantes: xxx

voici le code de ma catégorie. Il swizzlose AfurlsessionManager à injecter une cale dans le gestionnaire d'achèvement. La carénière met la réponse dans l'userinfo de Nserror.

https: //gist.github. com / chrishulbert / 35ecbec4b37d36b0d608


0 commentaires