Pregunta

Estoy intentando enviar el contenido de UITextView o UITextField como parámetros a un archivo PHP

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

Cuando i urlStr de registro, el formato de URL es aceptable con tal de que la UITextView o UITextField no contienen espacios. ¿Cómo hago para convertir los espacios al 20%?

editar

aquí está el código en la actualidad, que no sólo se bloquea, pero no es la codificación de la URL correctamente.

name = John Doe y tags = recurrentes entrada pesadilla y = Pruebas Pruebas Pruebas

se convierte a

name = John -1844684964oe y etiquetas = recurringightmare y entrada = Prueba 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];


}
¿Fue útil?

Solución

No se supone a URL-escapar de toda la cadena, que se supone que url-escapar de los componentes dinámicos. Trate

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

El segundo problema con el código (y, sin duda, la razón de la impresión impar) es lo que está pasando la cadena directamente a NSLog, por lo que está siendo tratado como una cadena de formato. Es necesario utilizar

NSLog(@"%@", encodedString);

lugar. Eso hará que sea imprime como se esperaba.

Edit: Un tercer problema con su código es que va a mezclar objetos autoreleased y propiedad, a continuación, la liberación de todos ellos al final. Ir a buscar a los 3 objetos que crea, y que posteriormente se libera más tarde. Uno de ellos no deben ser liberados más tarde, ya que se produce por un método que no se inició con la alloc palabras, copiar o nueva. Identificar el objeto en cuestión es un ejercicio deja al lector.

Otros consejos

En realidad, todas las respuestas anteriores contienen al menos algunas imprecisiones, que para muchos valores comunes de usuario proporcionada texto en los campos de texto no comunicarse correctamente con el servidor

ciento stringByAddingPercentEscapesUsingEncoding: escapa todos los caracteres que no son caracteres de URL válidos. Este método debe aplicarse una vez que la dirección URL completa.

Una respuesta anterior afirma que stringByAddingPercentEscapesUsingEncoding: funciona como las clases de construcción URL en muchos lenguajes de scripting, donde no se debe aplicar a toda la cadena de URL, pero no es así. Cualquier persona puede fácilmente verificar esta marcando su salida para &s sin escape y ?s. Por lo que está muy bien para aplicar a la totalidad de la cadena, pero no es suficiente para aplicar a su contenido de URL 'dinámica'.

La respuesta anterior es correcta en que usted tiene que trabajar un poco más a los nombres y los valores que intervienen en la cadena de consulta CGI. Desde CGI se especifica mediante RFC3875, esto se refiere a menudo como RFC3875 ciento escape. Se asegura de que sus nombres y valores no contienen caracteres que no son caracteres de URL válidos, pero que son importantes en otras partes de la URL (;, ?, :, @, &, =, $, +, {, }, < , >, y ,)

Sin embargo, es muy importante terminar también haciendo escapes de civil URL por ciento en la cadena completa para asegurarse de que todos los caracteres de la cadena son caracteres de URL válidos. Si bien no lo hace en su ejemplo, en general, no puede haber caracteres en una parte 'estática' de la cadena de caracteres que no son caracteres de URL válidos, por lo que necesita para escapar de esos también.

Por desgracia, NSString no nos da el poder para escapar de los personajes importantes RFC3875 por lo que tenemos que echar abajo en CFString para hacerlo. Obviamente utilizando CFString es un dolor por lo que generalmente agrego un Category en NSString este 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 esta Category en su lugar, el problema original podrían resolverse correctamente con lo siguiente:

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

Esto es un poco pesada variable sólo ser más clara. También tenga en cuenta que la lista de variables proporcionado a stringWithFormat: no debe nil terminado. La cadena de formato describe el número preciso de las variables que deben seguir a la misma. Además, técnicamente las cadenas de los nombres de cadena de consulta (nombre, las etiquetas de entrada, ..) se debe ejecutar a través stringByAddingPercentEscapesUsingEncoding: como una cuestión de rutina, pero en este pequeño ejemplo podemos ver fácilmente que no contienen caracteres no válidos URL.

Para ver por qué las soluciones anteriores son incorrectas, imagina que el texto de entrada del usuario en dreamEntry.text contiene un &, que no es poco probable. Con las soluciones anteriores, todo el texto siguiente al personaje se perdería por el tiempo que el servidor tiene ese texto, ya que el signo no literal sería interpretado por el servidor como poner fin a la porción del valor de ese par cadena de consulta.

Puede tomar su URL y uso:

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

NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top