2009-10-15 15 views
26

Hai de todo,El envío de datos de POST desde el iPhone a través de SSL HTTPS

En mi proyecto iphone necesito para pasar el nombre de usuario y contraseña a un servidor web, previamente me pase los datos utilizando el método GET y se utiliza la URL con el formato GET (por ejemplo: localhost: 8888/login? userName = admin & contraseña = contraseña) pero ahora necesito enviar esto como datos de POST,

¿alguien me puede ayudar a encontrar lo incorrecto en este código a continuación?

código que intentó ..


NSString *post =[NSString stringWithFormat:@"userName=%@&password=%@",userName.text,password.text]; 

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:@"https://localhost:443/SSLLogin/login.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSError *error; 
NSURLResponse *response; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
NSLog(data); 

esta página volverá éxito o no el uso de php echo

+2

¿Cómo es su código no funciona? –

+2

sí no funciona –

+0

Quiero decir, ¿cómo está fallando exactamente? ¿Cuál es el error? ¿Se está cayendo? ¿Dónde ves el problema, en el servidor o en tu código de cliente? –

Respuesta

9

Está enviando la solicitud como NSASCIIStringEncoding pero buscando NSUTF8StringEncoding

I' d conjunto

 
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 

y

 
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 

Sin embargo, como se señaló Nikolai - esto sería más fácil si supiéramos lo que era el error :-)

8

Bueno, esto no es exactamente una respuesta a su pregunta. Pero como alternativa, eche un vistazo a este código. Lo uso con éxito para enviar el nombre de usuario y la contraseña al servidor.

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:loginURL]]; 

//set HTTP Method 
[request setHTTPMethod:@"POST"]; 

//Implement request_body for send request here username and password set into the body. 
NSString *request_body = [NSString stringWithFormat:@"Username=%@&Password=%@",[Username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [Password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
//set request body into HTTPBody. 
[request setHTTPBody:[request_body dataUsingEncoding:NSUTF8StringEncoding]]; 

//set request url to the NSURLConnection 
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 


if(theConnection) //get the response and retain it 

continuación, se puede implementar el siguiente delegado para comprobar la respuesta

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 

Espero que esto ayude.

+0

no está claro si esto es más de HTTPS sin embargo. – oberbaum

+0

@norskben: aunque el código funciona a través de HTTP, no lo he probado a través de HTTPS –

+0

Sí, la pregunta requiere HTTPS. – oberbaum

0

Para depurar los problemas HTTP, su mejor opción es obtener la aplicación proxy HTTP Charles - registrará todas las comunicaciones HTTP hacia y desde un servidor, a través del simulador (e incluso puede configurarlo como un proxy para el teléfono si necesitas).

A continuación, utilice el programa Curl (desde el Terminal, está integrado) para generar una solicitud de trabajo post (tendrá que buscar en línea ejemplos de uso de CURL). Luego, simplemente compara cómo se formatea una solicitud de trabajo de CURL, con lo que está enviando su aplicación ... tenga en cuenta que el simulador se redirige automáticamente para que funcione a través de Charles, debe indicarle a la dirección proxy que se utilice para enviar las cosas a través de Charles.

28

finalmente conseguí una forma de enviar datos a través de una conexión segura desde el iPhone:

NSString *post =[[NSString alloc] initWithFormat:@"userName=%@&password=%@",userName.text,password.text]; 
NSURL *url=[NSURL URLWithString:@"https://localhost:443/SSLLogin/Login.php"]; 

NSLog(post); 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

/* when we user https, we need to allow any HTTPS cerificates, so add the one line code,to tell teh NSURLRequest to accept any https certificate, i'm not sure about the security aspects 
*/ 

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]]; 

NSError *error; 
NSURLResponse *response; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",data); 

para evitar un mensaje de advertencia por favor agregue


@interface NSURLRequest (DummyInterface) 
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host; 
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host; 
@end 

Cortesía:

  1. a todos mis amigos y seguidores de stack over flow
  2. http://www.cocoadev.com/index.pl?HTTPFileUpload
  3. http://blog.timac.org/?tag=nsurlrequest
+0

esto funcionó perfectamente para mí –

+1

Nota: setAllowsAnyHTTPSCertificate es una API privada. Consulte http://stackoverflow.com/questions/2001565/alternative-method-for-nsurlrequests-private-setallowsanyhttpscertificateforho para obtener más información. –

+4

Tenga en cuenta que este código hará que se rechace su aplicación, setAllowsAnyHTTPSCertificate: forHost: es una API privada – oberbaum

Cuestiones relacionadas