Domanda

Sto cercando di inviare il contenuto di UITextView o UITextField come parametri in un file php

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

Quando mi registro urlstr, il formato dell'url è ok, così come lungo come il UITextView o UITextField non contengono spazi.Come posso fare per convertire gli spazi a %20 ?

modifica

qui è il codice attuale, che non solo si blocca, ma non codifica l'url correttamente.

nome=John Doe&tag=incubo ricorrente&voce=Test test test

è convertito in

nome=Giovanni -1844684964oe&tag=recurringightmare&voce=Test 4.214929 e-307sting -1.992836 e+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];


}
È stato utile?

Soluzione

Non dovresti a URL-sfuggire l'intera stringa, si suppone di URL sfuggire i componenti dinamici. Prova

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];

Il secondo problema con il codice (e senza dubbio la ragione per la stampa dispari) è che stai passando la stringa direttamente a NSLog, quindi è di essere trattato come una stringa di formato. È necessario utilizzare

NSLog(@"%@", encodedString);

, invece. Questo renderà stampare come previsto.

Modifica: Una terza questione con il tuo codice è che stai mescolando oggetti autoreleased e di proprietà, poi tutti rilasciando alla fine. Andare a vedere i 3 oggetti creati, e che successivamente rilascia in seguito. Uno di loro non dovrebbe essere rilasciato entro perché è stato prodotto con un metodo che non inizia con le parole alloc, copiare o nuova. Identificare l'oggetto in questione è un esercizio lasciato al lettore.

Altri suggerimenti

In realtà, tutte le risposte precedenti contenere almeno alcune inesattezze, che per molti valori comuni dell'utente, a condizione che il testo nei campi di testo non comunicare correttamente con il server

stringByAddingPercentEscapesUsingEncoding: per cento sfugge a tutti i caratteri non validi URL caratteri.Questo metodo dovrebbe essere applicato una sola volta per l'intero URL.

Una risposta precedente sostiene che stringByAddingPercentEscapesUsingEncoding: funziona come la URL costruzione di classi in molti linguaggi di scripting, dove non si dovrebbe applicare a tutta la stringa dell'URL, ma non è così.Chiunque può facilmente verificare, controllando l'output per l'escape &s e ?s.Quindi, è bene applicare per l'intera stringa, ma non è sufficiente per applicare il vostro 'dinamico' url del contenuto.

La risposta precedente è giusto che si hanno a che fare un po ' di lavoro per i nomi e i valori che vanno nel vostro CGI stringa di query.Dal momento che la CGI è specificato da RFC3875, questo è spesso definito come RFC3875 per cento di fuggire.Si fa in modo che i vostri nomi e valori non contengono caratteri validi URL personaggi, ma che sono significativi in altre parti dell'URL (;, ?, :, @, &, =, $, +, {, }, <, >, e ,)

Tuttavia, è molto importante anche finire facendo pianura URL per cento sfugge la stringa completa per assicurarsi che tutti i caratteri della stringa sono validi URL caratteri.Mentre non è nel tuo esempio, in generale, ci potrebbe essere personaggi in un 'statico', la parte di stringa che non sono validi URL personaggi, così si ha bisogno di fuggire quelli.

Purtroppo, NSString non ci danno il potere di sfuggire alla RFC3875 personaggi più significativi, quindi dobbiamo scendere in CFString per fare in modo.Ovviamente utilizzando CFString è un dolore così io di solito aggiungere un Category su NSString in questo modo:

@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

Con questo Category a posto, il problema potrebbe essere risolto correttamente con il seguente:

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];

Questo è un po ' variabile pioggia basta essere più chiaro.Si noti inoltre che la variabile elenco di cui alla stringWithFormat: non dovrebbe essere nil è terminato.La stringa di formato descrive il numero preciso di variabili che devono seguire.Inoltre, tecnicamente corde la stringa di query nomi (nome, tag, ingresso,..) deve essere eseguito attraverso stringByAddingPercentEscapesUsingEncoding: come una questione di corso, ma in questo piccolo esempio si può facilmente vedere che essi non contengono un URL non valido caratteri.

Da vedere perché le soluzioni precedenti non sono corretti, immaginare che l'utente di testo di input in dreamEntry.text contiene un &, che non è improbabile.Con le soluzioni precedenti, tutto il testo seguente che personaggio vorresti essere perso da tempo il server ha che il testo, in quanto escape e commerciale potrebbe essere interpretato dal server come fine il valore porzione di stringa di query coppia.

Si può prendere il vostro URL ed impiego:

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

NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top