Frage

Ich versuche, den Inhalt von UITextView oder UITextField als Parameter an eine PHP-Datei zu senden

NSString *urlstr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];

Wenn ich urlStr einzuloggen, das URL-Format nur so lange in Ordnung ist wie die UITextView oder UITextField keine Leerzeichen enthalten. Wie würde ich 20 gehen über die Räume% Umwandlung?

Bearbeiten

Hier ist der Code zur Zeit, die nicht nur Abstürze, sondern die URL nicht korrekt kodiert.

name = John Doe & tags = wiederkehrender Alptraum & entry = Testing testing testing

wird umgewandelt

name = John -1844684964oe & tags = recurringightmare & entry = Testing 4.214929e-307sting -1.992836e + 00sting

- (IBAction)sendButtonPressed:(id)sender
{

    NSString *urlString = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@", nameField.text, tagsField.text, dreamEntry.text];

    NSString *encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [[NSURL alloc] initWithString:encodedString];

    NSLog(encodedString);

    NSLog(urlString);

    [urlString release];
    [url release];
    [encodedString release];


}
War es hilfreich?

Lösung

Sie sind nicht soll die gesamte Zeichenfolge URL-entkommen, sollen Sie die dynamischen Komponenten URL-entkommen. Versuchen

NSString *urlStr = [NSString stringWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",
                        [nameField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        [tagsField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        [dreamEntry.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        nil];
NSURL *url = [NSURL URLWithString:urlStr];

Das zweite Problem mit Ihrem Code (und zweifellos der Grund für den ungeraden Druck) ist, dass Sie die Zeichenfolge direkt an NSLog vorbei sind, so dass es wird als Format-String behandelt. Sie müssen verwenden

NSLog(@"%@", encodedString);

statt. Das wird es wie erwartet drucken zu können.

Edit: Ein drittes Problem mit Ihrem Code Sie Autoreleased und im Besitz Objekte abmischen, dann sie alle am Ende freigegeben wird. Schau auf die drei Objekte, die Sie erstellen, und die Sie anschließend später freigeben. Einer von ihnen sollte nicht später wieder freigelassen werden, weil sie durch ein Verfahren hergestellt wurden, die mit den Worten alloc, kopieren oder neu nicht starten. das betreffende Objekt zu identifizieren, ist eine Übung des Leser überlassen.

Andere Tipps

Eigentlich alle bisherigen Antworten enthalten zumindest einige Ungenauigkeiten, die für viele gemeinsamen Werte von Benutzern bereitgestellt Text in den Textfeldern nicht richtig mit dem Server kommunizieren

stringByAddingPercentEscapesUsingEncoding: Prozent entkommt alle Zeichen, die nicht gültig URL Zeichen sind. Diese Methode sollte einmal auf die gesamte URL angewendet wird.

Eine frühere Antwort behauptet, dass stringByAddingPercentEscapesUsingEncoding: wie die URL Gebäudeklassen in vielen Skriptsprachen arbeitet, wo man es auf die gesamte URL-Zeichenfolge nicht gelten soll, aber es funktioniert nicht. Jeder kann dies leicht überprüfen, indem sein Ausgang für unescaped &s und ?s überprüfen. So ist es in Ordnung für die gesamte Zeichenfolge anwenden, aber es ist nicht genug, um Ihren ‚dynamischer‘ url Inhalt anwenden.

Die vorherige Antwort ist richtig, dass Sie etwas mehr Arbeit, um die Namen und Werten zu tun, die in Ihren CGI-Abfrage-String gehen. Da CGI von RFC3875 spezifiziert ist, wird dies oft als RFC3875 Prozent Entkommen bezeichnet. Es stellt sicher, dass Ihre Namen und Werte keine Zeichen enthalten, die gültige URL Zeichen sind, die aber in anderen Teilen der URL von Bedeutung sind (;, ?, :, @, &, =, $, +, {, }, < , > und ,)

Es ist jedoch sehr wichtig, auch indem Ebene URL Prozent Fluchten über die vollständige Zeichenfolge zu beenden, um sicherzustellen, dass alle Zeichen in der Zeichenfolge gültige URL Zeichen sind. Während Sie nicht in Ihrem Beispiel zu tun, da in der Regel Zeichen in einem ‚statischen‘ Teil der Zeichenfolge sein könnte, die nicht gültige URL Zeichen sind, so dass Sie brauchen diese ebenfalls zu entkommen.

Leider NSString nicht gibt uns die Kraft, die RFC3875 signifikanten Zeichen zu entkommen, so dass wir nach unten in CFString tauchen, dies zu tun. Offensichtlich mit CFString ist ein Schmerz so dass ich im Allgemeinen eine Category auf NSString hinzufügen wie folgt:

@interface NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding;
@end

@implementation NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding {
    CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
    NSString *rfcEscaped = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                NULL, 
                                                (CFStringRef)self,
                                                NULL, 
                                                (CFStringRef)@";/?:@&=$+{}<>,",
                                                cfEncoding);
    return [rfcEscaped autorelease];
}
@end

Mit diesem Category an Ort und Stelle, kann das ursprüngliche Problem richtig mit folgendem gelöst werden:

NSString *urlEscapedBase = [@"http://server.com/file.php" stringByAddingPercentEscapesUsingEncoding:
                                            NSUTF8StringEncoding];
NSString *rfcEscapedName = [nameField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];
NSString *rfcEscapedTags = [tagsField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];
NSString *rfcEscapedEntry = [dreamEntry.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];

NSString *urlStr = [NSString stringWithFormat:@"%@?name=%@&tags=%@&entry=%@",
                                urlEscapedBase,
                                rfcEscapedName,
                                rfcEscapedTags,
                                rfcEscapedEntry];

NSURL *url = [NSURL URLWithString:urlStr];

Dies ist ein wenig variable schwere nur mehr klar sein. Beachten Sie auch, dass die Variablenliste stringWithFormat: bereitgestellt sollte nicht abgebrochen werden nil. Das Format-String beschreibt die genaue Anzahl der Variablen, die ihn folgen sollen. Auch technisch sind die Saiten Query-String-Namen (name, umbauten, Eintrag, ..) sollten durch stringByAddingPercentEscapesUsingEncoding: als selbstverständlich ausgeführt werden, aber in diesem kleinen Beispiel kann man leicht erkennen, dass sie keine ungültigen URL-Zeichen enthalten.

Um zu sehen, warum die bisherigen Lösungen nicht richtig sind, sich vorstellen, dass der Benutzer Eingabetext in dreamEntry.text eine & enthält, die nicht unwahrscheinlich ist. Bei den bisherigen Lösungen, die alle Text, das Zeichen nach würde durch die Zeit verloren wird die Server, dass der Text bekamen, da der unescaped Ampersand würde vom Server interpretiert wird als den Wert Teil dieses Query-String-Paares zu beenden.

Sie können Ihre URL und Nutzung nehmen:

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];

NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top