Je fais un message HTTP dans mon iPhone App et l'un des paramètres que j'envoie au serveur est une URL. Le problème est que lorsque je convertitais d'une Nsurl en Nsurlrequest, la chaîne http://www.slashdot.org devient http: / www .slashdot.org (l'une des barres obliques est manquante)
Y a-t-il un moyen autour de cela? p>
Voici le code que j'utilise: p>
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
3 Réponses :
Vous n'êtes pas pourcentage - échapper aux valeurs de la requête avant de les substituer à la chaîne. Je viens de faire un petit test et j'ai constaté que si je définissais Ceci est parce que la valeur de requête contient des caractères spéciaux, ce qui signifie que vous devez ajouter des escapades en pourcentage. À tout le moins, vous pouvez utiliser le Mediocre Dans ce cas, puis il va construire votre URL correctement. P> urltopublish code> à " http://example.com.com ", puis
nsurl code> le transformerait en" http: /example.com ".
- [NSString StringByAddingDurdingDurdingPenseSuçage:] Code> avec le
NsascIistringencoding code>. De plus, mieux seraient d'utiliser un mécanisme d'échappement différent (et plus complet), tel que celui que je suggère Dans ce poteau . P>
StringByAddingColcentaesSuçage: code> ne fonctionne pas, car c'est une jolie méthode mochette. Cela fonctionne sur un modèle inclusif em>, ce qui signifie que vous devez le dire quels caractères vous voulez pourcentage codé. (Sous le capot, il suffit d'appeler
CFURLCreatSestringByAddingPencapes () code>
) Cette fonction vous demande essentiellement d'une chaîne qui représente chaque caractère qu'il est autorisé à coder pourcentage (si je comprends la fonction). Ce que vous voulez vraiment, c'est un modèle exclusif em>: échapper à tout sauf [ce petit ensemble de caractères]. La fonction que j'ai liée ci-dessus, cela, et vous l'utiliseriez comme ceci: p>
< P> Voici une autre façon de le faire (et faites-le
@Lance comme je l'ai dit, StringByaddingPencAsesSuçage: code> est médiocre et, dans ce cas, ne fonctionne pas. Réponse éditée.
Merci Dave :) J'essaie de mettre en œuvre votre méthode à partir de l'autre poste et je mets la déclaration de méthode dans le fichier d'en-tête comme ceci: - (Nstring *) urlencodeding_ch; Mais lorsque j'essaie d'appeler la méthode dans mon fichier .m, tout comme vous l'avez sauf que cela indique codé au lieu de vous échapper, cela me donne un avertissement que cela pourrait ne pas répondre. Qu'est-ce que je fais mal?
@Lance Le code dans l'autre poste est censé être une catégorie code> nstring code>. Je viens de finir d'éditer mon post avec une alternative différente.
@Dave tu es incroyable! Merci beaucoup pour avoir mis le temps à m'aider. cela a fonctionné comme un charme :)
@Lance, vous êtes la bienvenu! Désolé d'être tellement véhément à ce sujet, mais j'ai appris grâce à une expérience difficile que presque personne ne reçoit ce droit.
@Dave, y compris Apple (ou quiconque a écrit le StringByAddingPercencaSuçage: Méthode) Merci encore!
edit 1 fort>
J'avais le problème comme décrit. Mais je l'ai manqué dans ma sortie. (D'où le vote DOWN :-()
J'ai donc supprimé le code que j'ai mis comme une réponse. * edit 2 strong> p> Mais lié à mes commentaires ici est une utilisation de pomme de code pour obtenir un Nsurlrequest, p> @Dave delong: je remarque dans l'Apple " Guide du programme du système de chargement de l'URL " L'exemple Création d'une connexion et d'une demande n'utilise aucune évasion. L'URL qu'il utilise provient d'une URLWithString
@markhunte Le problème ne s'échappe pas @ "exemple.host.com" code>, le problème s'échappe
http://example.com code>. Vous DO I> avez le problème que l'OP rapporte. Regardez votre sortie de journal. Il a
"url = http: /example.com" code> au lieu de
"url = http: //example.com" code> (qui est ce que l'OP est en attente, mais qui serait faux). devrait i> être
"url = http% 3a% 2f% 2fexemple.com" code>
@ Dave Delong, oui tu es correct. Mon mauvais, gêné de dire que je n'ai pas regardé ma propre production assez étroitement. Donc, le problème est réellement avec si vous utilisez l'initwithscheme: hôte: chemin: Pour vous Nsurl.
@Markhunte Yea, c'est un problème avec cette méthode et je n'ai toujours pas trouvé de solution, j'ai essayé d'utiliser les StringByReplacingocurencesFstring: @: "//" avec @ "/ \ /" ou avec @ "% 2f% 2f% 2f "Et aucun de ces travaux ....
Le problème n'est pas nsurl code>. Le problème n'est pas correctement codé pour le pourcentage de la chaîne avant de le donner à
nsurl code>. La documentation de
nsurl code> dit que le chemin doit être conforme à la RFC 2396, ce qui signifie que tous les caractères spéciaux doivent être codés pour le pourcentage avant de les donner à un initialiseur
Nsurl code> je>. En d'autres termes, le problème n'est pas
nsurl code>; Le problème ne comprend pas comment faire correctement une URL.
@Dave Delong, lorsque vous utilisez les autres méthodes de Nsurl sur le / n'est pas dépouillé. Pouvez-vous s'il vous plaît expliquer quelle est la différence. Que vous dites que ce n'est pas cette méthode particulière qui est une cote. Aussi dans le guide que j'ai mentionné, Apple ne fait rien de spécial pour former la demande. J'ai mis le code dans ma réponse ci-dessus car je ne peux pas la mettre ici ..
@Markhunte La différence est que la chaîne de requête et la partie de chemin de l'URL sont traitées différemment de l'hôte.
@Dave Delong, merci de cela, je vois ce que vous voulez dire, je regarde le chemin, qui même dans le Nsurl initwithscheme: méthode Le chemin est automatiquement échappé à l'aide de la méthode StringByAddingPercentaesSuçage: Méthode, mais l'hôte comme vous le dites est traité. différemment.
J'ajouterais que le problème est la difficulté de comprendre et d'obtenir la conformité RFC correcte, associée à la pauvre API, mettant le fardeau sur le consommateur de l'API plutôt que de faciliter la tâche.
Je l'ai réparé, c'est ce que je devais faire:
-1000000 Non Non Non Non Non. C'est absolument faux. Vous êtes supposé coder les touches et les valeurs de la chaîne de requête b>, pas tout le chemin. Vous créez une URL illégale de cette façon et le fait que cela fonctionne toujours est une bonne coïncidence, mais il va probablement briser à l'avenir. Est-ce juste, ou ne le faites pas du tout. B>
Je trouve que la barre oblique est perdue lors de la création du Nsurl de la Nstring, pas lorsqu'elle passe du Nsurl à Nsurlrequest. Vous pouvez voir que si vous NSLOG ([URL Description]).