Formater un plist pour une URL ?

yoannyoann Membre
Salut tout le monde,

Sur le bout de code sur lequel je travail actuellement j'ai besoin d'envoyer un plist dans une URL avec les %truc pour remplacer les caractères spéciaux.

En gros je dois arriver à  un truc comme ça :

http://totoserver.com/machin/bidule?input=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Cplist+version...


J'ai à  la base une NSURL de  http://totoserver.com/ et l'idée est d'utiliser URLWithString:relativeToURL: pour créer une nouvelle URL au besoin avec en NSString les arguments déjà  formaté.

Pour ce qui est du formatage je comptais utiliser stringWithFormat: pour faire en sorte que ne soit échapé que les valeurs du plist et non mon ? entre bidule et input=

Sauf que ça foire et je me retrouve avec des escape différent (%253C%3Fxml%2520version=%25221.0%2522%2520encoding=%2522UTF-8) et que mon URL n'est pas accepté.

Pour l'échappement j'utilise stringByAddingPercentEscapesUsingEncoding: avec ASCII/UTF8 ça rend pareil

Et la NSString de base contenant mon dict est généré de cette manière :

NSString *input = [[NSString alloc] initWithData:[NSPropertyListSerialization dataWithPropertyList:dict format:NSPropertyListXMLFormat_v1_0 options:0 error:&amp;err] encoding:NSUTF8StringEncoding];<br />



Si quelqu'un à  une idée je suis preneur :-)

Réponses

  • AliGatorAliGator Membre, Modérateur
    18:21 modifié #2
    Heu tu peux montrer un peu plus ton code, dans l'ordre ?
    Le résultat que tu obtiens est manifestement le résultat d'un double encodage par "percent escapes", %25 étant l'encodage du signe "%" lui-même.
    Il n'y a pas une méthode que tu utilises qqpart dans ton code qui rajouterait toute seule le percentEscape ?
    Si tu construis ton URL uniquement sous forme de NSString avec stringWithFormat, et la transforme en URL ensuite avec URLWithString, ça donne quoi ?

    NSString* input = [.... NSPropertyListSerialization ... ];<br />NSLog(@&quot;input: %@&quot;,input);<br />NSString* encInput = [input stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];<br />NSLog(@&quot;encInput: %@&quot;,encInput);<br />NSString* strUrl = [NSString stringWithFormat:@&quot;%@?input=%@&quot;,baseUrl,encInput];<br />NSLog(@&quot;strUrl: %@&quot;,strUrl);<br />NSURL* url = [NSURL URLWithString: strUrl];
    
  • yoannyoann Membre
    février 2010 modifié #3
    Merci pour ta réponse Ali

    En reprenant le code en attendant une réponse j'ai un truc plus fonctionnel. Mes URL sont OK simplement le serveur n'interprète pas l'argument comme il faut car les / ne sont pas échappé (ceux du doctype par exemple).

    Je vais voir pour les remplacer à  la main du coup :-/


    EDIT : En fait c'est tous les caractère type ? = & etc qui ne sont pas échappé :-/
  • yoannyoann Membre
    18:21 modifié #4
    Bon voilà  une catégorie qui marche pour ce dont j'ai besoin, si ça peut en aider d'autres :
    @implementation NSDictionary (URLSerialize)<br /><br />- (NSString*) serializeForURLArgument {<br />	NSError *err = nil;<br />	NSString *plist = [[NSString alloc] initWithData:[NSPropertyListSerialization dataWithPropertyList:self format:NSPropertyListXMLFormat_v1_0 options:0 error:&amp;err] encoding:NSUTF8StringEncoding];<br />	if (plist == nil) return nil;<br />	NSMutableString *string = [NSMutableString stringWithString:[plist stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];<br />	[string replaceOccurrencesOfString:@&quot;/&quot; withString:@&quot;%2F&quot; options:NSCaseInsensitiveSearch range:NSMakeRange(0, [string length])];<br />	[string replaceOccurrencesOfString:@&quot;?&quot; withString:@&quot;%3F&quot; options:NSCaseInsensitiveSearch range:NSMakeRange(0, [string length])];<br />	[string replaceOccurrencesOfString:@&quot;=&quot; withString:@&quot;%3D&quot; options:NSCaseInsensitiveSearch range:NSMakeRange(0, [string length])];<br />	[string replaceOccurrencesOfString:@&quot;+&quot; withString:@&quot;%20&quot; options:NSCaseInsensitiveSearch range:NSMakeRange(0, [string length])];<br />	return [string autorelease];<br />}<br /><br />@end
    

  • muqaddarmuqaddar Administrateur
    18:21 modifié #5
    Et ce genre de fonction ?

    NSString *encodedMessage = (NSString *)CFURLCreateStringByAddingPercentEscapes(<br />NULL, <br />NULL, <br />NULL, <br />(CFStringRef)@&quot;!*&#39;();:@&amp;=+$,/?%#&#91;]&quot;,<br />kCFStringEncodingISOLatin1);
    
  • AliGatorAliGator Membre, Modérateur
    18:21 modifié #6
    Oui Alex a été plus rapide que moi, mais pour ma part quand la méthode de NSString ne me suffit pas, j'utilise sa version toll-free-bridged de CoreFoundation, qui permet d'avoir un peu plus d'options... j'en ai même fait une macro pour ma part :D
  • yoannyoann Membre
    18:21 modifié #7
    Je ne connaissais tout simplement pas :-)

    Je vais corriger mon code avec ça, merci de l'info
Connectez-vous ou Inscrivez-vous pour répondre.