NSURLRequest: Comment gérer un redirigé post?
J'ai essayé et testé l'utilisation de NSURLRequest (et accompagnements) la mise en œuvre, qui fonctionne très bien pour l'Obtient, et des Postes pour une URL donnée.
Cependant, je veux maintenant déplacer la cible de l'URL sans changer l'URL utilisée par l'application, donc j'ai l'intention d'utiliser une webhop rediriger via mon fournisseur de DNS.
Cela fonctionne très bien pour les requêtes GET, mais les POSTs juste accrocher... pas de connexion réponse est reçue.
Pertinentes iOS méthode de traitement d'une redirection est,
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
Selon la documentation d'Apple (la manipulation des redirections),
Si le délégué ne pas mettre en œuvre de connexion:willSendRequest:redirectResponse:, tous les canonique changements et le serveur redirige sont autorisés.
Bien, ce n'est pas mon expérience, car en laissant cette méthode ne fonctionne pas pour moi. La demande se bloque sans réponse.
Apple propose en outre la mise en œuvre, de willSendRequest (voir ci-dessus liés dans la documentation d'Apple), encore une fois cela ne fonctionne pas pour moi. Je vois les invocations, mais la demande tout simplement l'accrocher.
Mon actuel de la mise en œuvre de willSendRequest est comme suit (voir ci-dessous). Il fait suite à la redirection, mais les poignées de la demande comme si c'était un OBTENIR, plutôt que d'un POSTE.
Je crois que le problème, c'est que la redirection est en train de perdre le fait que la requête HTTP est un POST (il y a peut être plus de problèmes, tels que la réalisation de la demande du Corps en avant trop?).
Je ne suis pas sûr de ce que je devrais faire ici. Donc, tous les conseils sur la façon de gérer correctement un POST qui reçoit une redirection serait appréciée. Merci.
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) redirectResponse;
int statusCode = [httpResponse statusCode];
NSLog (@"HTTP status %d", statusCode);
//http statuscodes between 300 & 400 is a redirect ...
if (httpResponse && statusCode >= 300 && statusCode < 400)
{
NSLog(@"willSendRequest (from %@ to %@)", redirectResponse.URL, request.URL);
}
if (redirectResponse)
{
NSMutableURLRequest *newRequest = [request mutableCopy]; //original request
[newRequest setURL: [request URL]];
NSLog (@"redirected");
return newRequest;
}
else
{
NSLog (@"original");
return request;
}
}
DES INFORMATIONS SUPPLÉMENTAIRES 1
HTTP code reçu par willSendRequest est de 301 - 'Déplacée de façon Permanente.
À l'aide de allHTTPHeaderFields pour extraire les champs d'en-tête, je vois qu'il demande a l'origine j'soumettre a l'en-tête
HTTP header {
"Content-Length" = 244;
"Content-Type" = "application/json";
}
...et le copié /redirigé demande a la tête de,
Redirect HTTP header {
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Type" = "application/json";
}
...qui ne ressemble pas à une copie de la demande initiale, ou même un sur-ensemble.
OriginalL'auteur Snips | 2012-05-28
Vous devez vous connecter pour publier un commentaire.
Conserver l'original de votre demande, puis de fournir votre propre
willSendRequest:redirectResponse:
pour personnaliser que demande, plutôt que de travailler avec l'un d'Apple vous fournit.En faisant cela, vous êtes explicitement en négligeant certains aspects de la spécification HTTP: Redirige doit généralement être transformé en OBTENIR des demandes (selon le code de statut HTTP). Mais dans la pratique, ce comportement va de mieux vous servir lors de l'Affichage d'une application iOS.
Voir aussi:
Yep, un test rapide a indiqué que cette solution fonctionne. Merci les gars!
Vous être en mesure d'obtenir la demande d'origine de la
connection
, je ne me souviens pas. La peine de chercher.Cette méthode est spécifiée comme obsolète après l'iOS 4.3. bit.ly/RqbRn5 Est-il ok pour la mettre en œuvre? (J'ai essayer cette solution & ça marche!)
originalRequest
devrait être renommérequest
pour utiliser cet exemple par copier-coller. Apple fournit également une bonne explication Développeurs d'AppleOriginalL'auteur
La spécification HTTP, pour le traitement de la 3xx classe de codes d'état est très hostile envers les protocoles autres que GET et HEAD. Il attend une sorte d'interaction avec l'utilisateur à l'étape intermédiaire de la redirection, ce qui a conduit à une pléthore d'incompatible client et le serveur des mises en œuvre, ainsi qu'un sérieux casse-tête pour les développeurs de services web.
À partir d'un iOS NSURL point de vue, l'une des choses que vous pourriez vouloir vérifier, c'est que le POST original corps est inclus dans la nouvelle, demande de redirection.
Basé sur vos commentaires sur ma réponse originale à cette question, et les modifications apportées à votre question, il semblerait que l'URL que vous tentez d'accéder a été mis à jour de façon permanente (301 code d'état). Dans ce cas, vous pouvez effectivement éviter les redirections tout en utilisant la nouvelle URL.
C'est bizarre, puis. Vous ne devriez pas avoir à cloner et à (re)transmettre la demande, si c'est le cas. Êtes-vous coincé avec l'aide de NSURL classes?
Je pense que je suis coincé avec NSURL, est-il une meilleure alternative?
Vous pourriez essayer MKNetworkingKit. En attendant, vous pouvez exécuter votre code et ajouter à la question, exactement le code d'état HTTP que vous obtenez?
Merci pour le retour pour cela et d'essayer de l'aider. J'ai ajouté quelques informations supplémentaires ci-dessous à la question d'origine.
OriginalL'auteur