por - php post request
¿Enviar POST multiparte desde iOS y leer parámetros en PHP $_POST? (1)
Ok, como no pude encontrar una solución sin bibliotecas externas, arreglé mi código y lo abrí , en caso de que alguien quiera usarlo.
El problema en el código que publiqué fue el / r / n en la línea
[myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@/r/n", POSTBoundary] forHTTPHeaderField:@"Content-Type"];
Eliminar eso solucionó todo.
Espero que esto ayude a alguien más :)
Estoy tratando de enviar una publicación de varias líneas desde un iPhone / iPad a un servicio php, el problema es que, por alguna razón, el tipo de contenido POST parece ser application / x-www-form-urlenconded, (encontré esto usando Wireshark)
Esto es en realidad un fragmento de la captura de paquete POST de Wireshark:
**Content-Type: application/x-www-form-urlencoded/r/n**
Content-Length: 324/r/n
[Content length: 324]
Connection: keep-alive/r/n
/r/n
[Full request URI: http://my.server.com/mobile/tools/authentication]
Line-based text data: application/x-www-form-urlencoded
--0xKhTmLbOuNdArY/r/n
Content-Disposition: form-data; name="login"/r/n
/r/n
[email protected]/r/n
--0xKhTmLbOuNdArY/r/n
Content-Disposition: form-data; name="password"/r/n
/r/n
somepassword/r/n
--0xKhTmLbOuNdArY/r/n
/r/n
--0xKhTmLbOuNdArY--/r/n
El problema es que en el servidor estoy tratando de leer las variables de inicio de sesión y contraseña de esta solicitud POST, pero no es posible porque creo que php piensa que la solicitud POST es x-www-form-urlencoded
, así que si configuro la authentication.php
para hacer:
<?php
echo("<pre>")
print_r($_POST)
echo("</pre>")
?>
Entiendo esto:
<pre>Array/n
(/n
[--0xKhTmLbOuNdArY/r/n
Content-Disposition:_form-data;_name] => "login"/r/n
/r/n
[email protected]/r/n
--0xKhTmLbOuNdArY/r/n
Content-Disposition: form-data; name="password"/r/n
/r/n
somepassword/r/n
--0xKhTmLbOuNdArY/r/n
/r/n
--0xKhTmLbOuNdArY--/r/n
/n
)/n
</pre>
Esto claramente no es bueno, ya que si envío una solicitud usando este formulario html simple:
<FORM action="http://my.server.com/mobile/tools/authentication.php" method="post">
<P>
<LABEL for="login">E-mail: </LABEL>
<INPUT type="text" name="login"><BR>
<LABEL for="password">pass: </LABEL>
<INPUT type="text" name="password"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</P>
</FORM>
Obtengo esta traza de Wireshark como se esperaba de un formulario:
Content-Type: application/x-www-form-urlencoded/r/n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8/r/n
Accept-Encoding: gzip,deflate,sdch/r/n
Accept-Language: en-US,en;q=0.8/r/n
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3/r/n
Cookie: PHPSESSID=tpp10pbrdkkf5dg9qprlamfuu2/r/n
/r/n
[Full request URI: http://mymed2.sophia.inria.fr/mobile/tools/authentication.php]
Line-based text data: application/x-www-form-urlencoded
login=hello%40hello.com&password=somepassword
Y esta salida de texto de print_r($_POST)
en authentication.php
<pre>Array/n
(/n
[login] => [email protected]/n
[password] => somepassword/n
)/n
</pre>
Esta es la forma en que estoy elaborando la solicitud POST en Objective-C y Cocoa
- (NSMutableURLRequest *) POSTRequestWithURL:(NSURL *)url andDataDictionary:(NSDictionary *) dictionary
{
// Create a POST request
NSMutableURLRequest *myMedRequest = [NSMutableURLRequest requestWithURL:url];
[myMedRequest setHTTPMethod:@"POST"];
// Add HTTP header info
// Note: POST boundaries are described here: http://www.vivtek.com/rfc1867.html
// and here http://www.w3.org/TR/html4/interact/forms.html
NSString *POSTBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
[myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@/r/n", POSTBoundary] forHTTPHeaderField:@"Content-Type"];
// Add HTTP Body
NSMutableData *POSTBody = [NSMutableData data];
[POSTBody appendData:[[NSString stringWithFormat:@"--%@/r/n",POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
// Add Key/Values to the Body
NSEnumerator *enumerator = [dictionary keyEnumerator];
NSString *key;
while ((key = [enumerator nextObject])) {
[POSTBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"%@/"/r/n/r/n", key] dataUsingEncoding:NSUTF8StringEncoding]];
[POSTBody appendData:[[NSString stringWithFormat:@"%@", [dictionary objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]];
[POSTBody appendData:[[NSString stringWithFormat:@"/r/n--%@/r/n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
}
// Add the closing -- to the POST Form
[POSTBody appendData:[[NSString stringWithFormat:@"/r/n--%@--/r/n", POSTBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
// Add the body to the myMedRequest & return
[myMedRequest setHTTPBody:POSTBody];
return myMedRequest;
}
Como ve, al principio lo hago:
[myMedRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@/r/n", POSTBoundary] forHTTPHeaderField:@"Content-Type"];
Pero en los registros de seguimiento anteriores de Wireshark, el paquete POST se veía como Content-Type: application / x-www-form-urlencoded, ¿tal vez estoy haciendo algo diferente?
Gracias :)
EDITAR: quiero evitar marcos externos como ASIHTTPRequest, por cierto, el desarrollador principal ha abandonado el desarrollo ASIHTTPRequest como se indica aquí