2011-03-23 4 views
10

Je fais un HTTP Post dans mon application iphone et l'un des paramètres que j'envoie au serveur est une URL. Le problème est que quand je convertis d'un NSURL à un NSURLRequest, la chaîne http://www.slashdot.org devient http: /www.slashdot.org (l'une des barres obliques est manquante)Perdre une/lors de la conversion de NSURL à NSURLRequest

est-il un moyen de contourner ce problème?

ici est le code que je utilise:

NSString *host = @"example.host.com"; 
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *jsonString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

Je l'ai utilisé NSLog pour voir où il perd la «/» et il est sur la quatrième ligne:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 

remerciements pour prendre le temps de lire!

+0

Je trouve que la barre est perdue lors de la création du NSURL du NSString, non lorsque vous passez de NSURL à NSURLRequest. Vous pouvez voir que si vous NSLog ([url description]). – Oscar

Répondre

12

Vous n'échappez pas en pourcentage aux valeurs de requête avant de les substituer à la chaîne. Je viens de faire un petit test, et j'ai trouvé que si je donnais urlToPublish à "http://example.com", alors NSURL le transformerait en "http: /example.com". Cela est dû au fait que la valeur de requête contient des caractères spéciaux, ce qui signifie que vous devez ajouter des pourcentages d'échappement. À tout le moins, vous pouvez utiliser le médiocre -[NSString stringByAddingPercentEscapesUsingEncoding:] avec le NSASCIIStringEncoding. Il vaudrait mieux utiliser un mécanisme d'échappement différent (et plus complet), tel que celui que je propose in this post.


Dans ce cas, stringByAddingPercentEscapesUsingEncoding: ne fonctionne pas, car il est une méthode assez moche. Cela fonctionne sur un modèle inclus, ce qui signifie que vous devez lui indiquer les caractères que vous voulez coder en pourcentage. (Sous le capot, il appelle simplement CFURLCreateStringByAddingPercentEscapes()) Cette fonction vous demande fondamentalement une chaîne qui représente chaque caractère qu'il est autorisé à coder en pourcentage (si je comprends bien la fonction). Ce que vous voulez vraiment, c'est un modèle exclusif: échapper tout sauf [ce petit ensemble de caractères]. La fonction I lié à fait au-dessus de cela, et vous utiliseriez comme ceci:

NSString *urlToPublish = [@"http://stackoverflow.com" URLEscapedString_ch]; 
NSString *host = @"example.host.com"; 
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString]; 

Et puis il va construire votre URL correctement.


Voici une autre façon, vous pouvez le faire (et de le faire correctement ). Aller à my github page et télécharger "DDURLBuilder.h" et "DDURLBuilder.m", puis construire votre URL comme ceci:

NSString *localEmail = @"[email protected]"; 
NSString *urlToPublish = @"http://stackoverflow.com" 

DDURLBuilder *b = [DDURLBuilder URLBuilderWithURL:nil]; 
[b setScheme:@"http"]; 
[b setHost:@"example.host.com"]; 
[b setPath:@"SetLeaderUrl.json"]; 
[b addQueryValue:localEmail forKey:@"leader_email"]; 
[b addQueryValue:urlToPublish forKey:@"url"]; 

NSURL *url = [b URL]; 
+0

J'ai essayé ceci et je ne m'en vais pas, ayant toujours le problème – Lance

+0

@Lance comme je l'ai dit, 'stringByAddingPercentEscapesUsingEncoding:' est médiocre et, dans ce cas, ne fonctionne pas. Réponse éditée –

+0

Merci dave :) J'essaie d'implémenter votre méthode à partir de l'autre poste, et j'ai mis la déclaration de la méthode dans le fichier d'en-tête comme ceci: - (NSString *) URLEncodedString_ch; mais quand j'essaie d'appeler la méthode dans mon fichier .m, tout comme vous l'avez, sauf qu'il est dit codé au lieu de s'échapper, il me donne un avertissement qu'il peut ne pas répondre. Qu'est-ce que je fais mal? – Lance

-2

EDIT 1 Je recevais le problème comme décrit. Mais l'a manqué dans ma sortie. (D'où le vote down :-() ont donc enlevé le code que je mets en place comme une réponse.

* Edit 2

Mais lié à mes commentaires ici est une utilisation de pomme de code pour obtenir un NSURLRequest ,

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"] 
        cachePolicy:NSURLRequestUseProtocolCachePolicy 
       timeoutInterval:60.0];  

DeLong @ Dave: Je remarque que dans l'Apple « URL Loading System Program Guide » l'exemple la création d'une connexion et ne demande pas utiliser Escaping.L'URL qu'il utilise est d'un NSURL URLWithString:

+0

@markhunte le problème n'échappe pas '@" example.host.com "', le problème est l'échappement 'http: // example.com'. Vous * avez * le problème que l'OP signale. Regardez votre sortie de journal. Il a '" url = http: /example.com "' au lieu de '" url = http: //example.com "' (qui est ce que l'OP attend, mais qui serait faux). Il * devrait * être "" url = http% 3A% 2F% 2Fexample.com "' –

+0

@ Dave DeLong, oui vous avez raison. Mon mal, Embarrassé de dire que je n'ai pas regardé ma propre production assez étroitement. Donc, le problème est réellement avec si vous utilisez le initWithScheme: host: path: pour vous NSURL. – markhunte

+0

@markhunte oui, c'est un problème avec cette méthode et je n'ai toujours pas trouvé de solution, j'ai essayé d'utiliser le stringByReplacingOccurrencesOfString: @: "//" withString @ "/ \ /" ou avec @ "% 2F % 2F "et aucun de ces travaux .... – Lance

-4

Je l'ai fixé, c'est ce que je devais faire:

NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish]; 
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
urlString = [NSString stringWithFormat:@"%@%@%@",scheme,host,urlString]; 
NSURL *url = [[NSURL alloc] initWithString:urlString]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
+7

-1000000 NON NON NON NON NON CECI EST ABSOLUMENT FAUX. Vous êtes seulement supposé encoder ** les clés et les valeurs de la chaîne de requête **, pas le chemin entier. Vous créez une URL ILLÉGALE de cette façon, et le fait qu'elle fonctionne toujours est une heureuse coïncidence, mais elle risque fort de se produire dans le futur. ** Faites-le bien, ou ne le faites pas du tout. ** –