Poignée d'erreur HTTP avec NSURLSession?
Je suis en train d'envoyer une requête HTTP avec NSURLSession
. Il fonctionne très bien, mais lorsque le serveur ne répond pas, je ne trouve pas où le code d'erreur HTTP est stocké. Le troisième paramètre de completionHandler
est juste une très général NSError
. J'ai lu la référence de NSURLResponse
, mais rien trouvé.
NSURLSessionDataTask *dataTask =
[session dataTaskWithRequest:[self postRequestWithURLString:apiEntry parameters:parameters]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(!error) NSLog([[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
];
[dataTask resume];
Vous devez vous connecter pour publier un commentaire.
Le deuxième paramètre de la
completionHandler
est leNSURLResponse
, qui lors d'une requête HTTP, est généralement unNSHTTPURLResponse
. Donc, vous devez généralement faire quelque chose comme:if ([response isKindOfClass:[NSHTTPURLResponse class]] && response == nil)
ne sera jamais vrai (soitresponse
estnil
ou il peut être la réponse HTTP, mais jamais les deux en même temps). Peut-être que vous avez voulu direresponse != nil
, mais c'est implicite dans l'appel àisKindOfClass
(c'est à dire siresponse
estnil
, appelantisKindOfClass
surnil
objet n'est pas vrai). Si vous voulez vraimentif (response != nil && [response isKindOfClass:[NSHTTPURLResponse class]])
, il n'y a rien de mal à cela et fait l'intention explicite, mais est redondante.Swift 3:
Si côté serveur erreur s'est produite
data
paramètre de gestionnaire d'achèvement peut contenir quelques informations utilesEn général, je mince vous devez mettre en œuvre
URLSession:task:didCompleteWithError:
deNSURLSessionTaskDelegate
protocole de session déléguédocs: NSURLSessionTaskDelegate Protocole De Référence
vous pouvez essayer quelque chose comme cela. J'ai créé une méthode simple qui sera en mesure de publier des données sur le serveur et obtenir la réponse du serveur. Vous pouvez obtenir le statut de serveur de code via NSHTTPURLResponse classe.
Espérons, aidera 🙂
Vous pouvez avoir l'ensemble des en-têtes dans
allHeaderFields
de bien vouloir le convertir en objective-C.