3 Stimmen

Ampersand in POST-Anfrage verursacht Chaos

Ich habe ein einfaches POST von meiner iphone App. Seine Arbeit gut, außer Übergabe ein Ampersand verursacht das Backend zu brechen - es ist fast wie seine Behandlung es wie eine GET-Anfrage (Ampersands trennen die Variablennamen). Muss ich irgendeine Art von Kodierung zuerst tun? Hier ist der Code:

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", str, emailAddress.text];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.myurl.com/myscript.php"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]];

// generates an autoreleased NSURLConnection
[NSURLConnection connectionWithRequest:request delegate:self];

7voto

Tiago Almeida Punkte 13695

Ich hatte dieses Problem in iOS7 und die akzeptierte Antwort funktionierte überhaupt nicht (eigentlich ist das mein Standard, wenn ich Daten an das Backend sende). Das kaufmännische Und brach im Backend ab, also musste ich das & durch %26 ersetzen. Das Backend wurde in Python erstellt und der Code war veraltet und verwendete ASI.

Im Wesentlichen habe ich Folgendes getan:

NSString *dataContent =  [NSString stringWithFormat:@"text=%@", 
    [json stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

dataContent = [dataContent stringByReplacingOccurrencesOfString:@"&" 
                                                     withString:@"%26"];

1voto

Recycled Steel Punkte 2252

ByAddingPercent....... wird nicht funktionieren, da & ein gültiges URL-Zeichen ist.

Ich musste ein JSON mit & darin senden, es ist jedoch die gleiche Idee;

NSString *post = [NSString stringWithFormat:@"JSON=%@", (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)jsonString, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8))];

"jsonString" am Ende ist das, was konvertiert wird.

0voto

akashivskyy Punkte 42822

Bearbeiten: Als stringByAddingPercentEscapesUsingEncoding: verwendet werden sollte, um Teile der Abfrage zu kodieren, nicht die gesamte Abfrage, sollten Sie stattdessen eine andere Methode verwenden.

Leider stellt Foundation eine solche Methode nicht zur Verfügung, so dass Sie zu CoreFoundation greifen müssen:

- (NSString *)stringByURLEncodingString:(NSString *)string {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
        kCFAllocatorDefault,
        (__bridge CFStringRef)string,
        NULL, // or (__bridge CFStringRef)(@"[].")
        (__bridge CFStringRef)(@":/?&=;+!@#$()',*"),
        kCFStringEncodingUTF8
    );
}

Sie können verwenden

- stringByAddingPercentEscapesUsingEncoding:

In Ihrem Fall wird es so aussehen:

NSString * content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [emailAddress.text  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

Sie können dies auch auf diese Weise tun:

NSString *dataStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *emailStr = [emailAddress.text  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", dataStr, emailStr];

0voto

M3NTA7 Punkte 1245

Ich bin nicht sicher, ob das in Ihrem Fall funktioniert, aber Sie könnten %38 versuchen, um das kaufmännische Und zu kodieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X