2009-08-09 6 views
1

Ich habe eine Methode zum Erstellen von URLs für mich erstellt.Codierung Zeichenfolge Argumente für URLs

Wenn ich versuche, etwas wie unten zu bauen, sind die URLs natürlich nicht verschlüsselt.

NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"http://other.com", @"url", 
          @"ABCDEF", @"apiKey", nil]; 

NSLog(@"%@", [self urlFor:@"articles" arguments:args]);` 

Der Rückgabewert ist http://api.example.com/articles?version=2.0.1&url=http://other.com&apiKey=ABCDEF wenn es http://api.example.com/articles?version=2.0.1&url=http%3A%2F%2Fother.com&apiKey=ABCDEF sein sollte.

Ich muss Schlüssel und Wert zu kodieren. Ich suchte nach etwas und fand CFURLCreateStringByAddingPercentEscapes und stringByAddingPercentEscapesUsingEncoding aber keiner der Tests, die ich machte, arbeitete.

Wie kann ich es tun?

+0

Entschuldigung! Mein Code hat die Syntaxhervorhebung durchbrochen und ich kann es nicht beheben! Jemand? –

Antwort

3

IIRC, Schrägstriche sollten korrekt interpretiert werden, wenn sie sich im Abfrageteil einer URL befinden. Hast du getestet, ob es immer noch ohne codierte Schrägstriche funktioniert? Ansonsten tun so etwas wie:

if ([args isKindOfClass:[NSDictionary class]]) { 
     for (NSString *key in [args allKeys]) { 
      NSString *value = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)[args objectForKey:key], NULL, CFSTR("/?&:=#"), kCFStringEncodingUTF8) autorelease]; 
      [url appendString:[NSString stringWithFormat:@"&%@=%@", key, value]]; 
      [value release]; 
     } 
} 

return url; 

Notieren Sie sich den Wert des vierten Argument CFURLCreateStringByAddingPercentEscapes.

+0

Schön! Jetzt funktioniert es! –

+0

Eine Frage: das vierte Argument kann jedes Zeichen akzeptieren, das codiert werden muss? –

+0

Ja. Aus der Dokumentation: legalURLCharactersToBeEscaped Rechtliche Zeichen, die zu maskieren sind. Übergeben Sie NULL, um anzugeben, dass keine zulässigen Zeichen ersetzt werden. Es gibt nur wenige Zeichen, die sonst nicht entgangen sein würden, aber ich ging dem sicheren Weg, weil ich zu faul war, bis zu schauen, welche davon die waren (obwohl es wahrscheinlich eine gute Idee sein würde). – Wevah

0

Ich würde unsere KSFileUtilities Reihe von Klassen empfehlen. Ihr Beispiel wäre dann:

- (NSString *)urlFor:(NSString *)path arguments:(NSDictionary *)args 
{ 
    NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:args]; 
    [parameters setObject:@"2.0.1" forKey:@"version"]; 

    NSURL *result = [NSURL ks_URLWithScheme:@"http" 
             host:@"api.example.com" 
             path:path 
          queryParameters:parameters; 

    return [result absoluteString]; 
} 
Verwandte Themen