2016-06-21 11 views
0

Wenn ich ein Abfrageelement hinzufügen, dann ändert NSURLComponents% 2B in +, während% 7B unverändert bleibt. Von meinem Verständnis her sollte es entweder "+" und "{" dekodieren, warum dekodiert es nur einen von ihnen?NSURLComponents ändert% 2B in + beim Hinzufügen einer neuen Abfrage Element

NSString *urlString = @"http://www.example.com?a=%7B1%2B2%7D"; 
    NSURLComponents *components = [NSURLComponents componentsWithString:urlString]; 
    NSLog(@"%@",components); 
    // <NSURLComponents 0x7ffc42c19d40> {scheme = http, user = (null), password = (null), host = www.example.com, 
    // port = (null), path = , query = a=%7B1%2B2%7D, fragment = (null)} 
    NSURLQueryItem *queryItem = [NSURLQueryItem queryItemWithName:@"hl" value:@"en-us"]; 
    components.queryItems = [components.queryItems arrayByAddingObject:queryItem]; 
    NSLog(@"%@",components); 
    // <NSURLComponents 0x7ffc42c19d40> {scheme = http, user = (null), password = (null), host = www.example.com, 
    // port = (null), path = , query = a=%7B1+2%7D&hl=en-us, fragment = (null)} 
+0

Dies ist ein tatsächlich bestehendes Problem, ich weiß nicht, warum das downvotes? – ooops

Antwort

0

Das Zeichen '+' ist in der Abfragekomponente zulässig, daher muss es nicht in Prozent codiert sein.

Einige Systeme verwenden das '+' als Leerzeichen und verlangen, dass '+' das Pluszeichen prozentual codiert. Diese Art der zweistufigen Codierung (Umwandlung von Pluszeichen in% 2B und anschließende Umwandlung von Leerzeichen in Pluszeichen) ist jedoch anfällig für Fehler, da dies leicht zu Codierungsproblemen führt. Es bricht auch, wenn die URL normalisiert ist (Syntaxnormierung von URLs beinhaltet die Entfernung aller unnötigen Prozent-Encoding - siehe rfc3986 Abschnitt 6.2.2.2).

Wenn Sie dieses Verhalten aufgrund des Servers benötigen, mit dem Ihr Code kommuniziert, werden Sie diese zusätzlichen Umwandlungen selbst durchführen. Hier ist ein Code-Snippet, das zeigt, was man in beiden Richtungen tun müssen:

NSURLComponents components = [[NSURLComponents alloc] init]; 
NSArray items = [NSArray arrayWithObjects:[NSURLQueryItem queryItemWithName:@"name" value:@"Value +"], nil]; 
[components setQueryItems:items]; 
NSLog(@"URL queryItems: %@", [components queryItems]); 
NSLog(@"URL string before: %@", [components string]); 
// Replace all "+" in the percentEncodedQuery with "%2B" (a percent-encoded +) and then replace all "%20" (a percent-encoded space) with "+" 
components.percentEncodedQuery = [[components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"] stringByReplacingOccurrencesOfString:@"%20" withString:@"+"]; 
NSLog(@"URL string after: %@", [components string]); 
// This is the reverse if you receive a URL with a query in that form and want to parse it with queryItems 
components.percentEncodedQuery = [[components.percentEncodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%20"] stringByReplacingOccurrencesOfString:@"%2B" withString:@"+"]; 
NSLog(@"URL string back: %@", [components string]); 
NSLog(@"URL queryItems: %@", [components queryItems]); 

Die Ausgabe lautet:

URL queryItems: (" {name = name, value = Value +}") 
URL string before: ?name=Value%20+ 
URL string after: ?name=Value+%2B 
URL string back: ?name=Value%20+ 
URL queryItems: (" {name = name, value = Value +}") 
Verwandte Themen