web-dev-qa-db-fra.com

Envoi POST données de l'iphone via SSL HTTPS

Hai all,

Dans mon projet iphone, je dois transmettre le nom d'utilisateur et le mot de passe à un serveur Web, auparavant je transmettais des données à l'aide de la méthode GET et utilisais l'url au format GET (par exemple: localhost: 8888/login? UserName = admin & password = password) mais maintenant je besoin de l'envoyer en tant que données POST,

quelqu'un peut-il m'aider à trouver ce qui ne va pas dans ce code ci-dessous?

code que j'ai essayé ..


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

cette page renverra le succès ou l'échec en utilisant l'écho php

26
shinto Joseph

Vous envoyez la demande en tant que NSASCIIStringEncoding mais recherchez NSUTF8StringEncoding

Je mettrais

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

et

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

cependant, comme Nikolai l'a noté - ce serait plus facile si nous savions quelle était l'erreur :-)

9
Andiih

J'ai enfin réussi à envoyer des données via une connexion sécurisée depuis l'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);

pour éviter un message d'avertissement, veuillez ajouter


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

Courtoisie:

  1. à tous mes amis et sympathisants
  2. http://www.cocoadev.com/index.pl?HTTPFileUpload
  3. http://blog.timac.org/?tag=nsurlrequest
28
shinto Joseph

Eh bien, ce n'est pas exactement une réponse à votre question. Mais comme alternative, jetez un œil à ce code, je l'utilise avec succès pour envoyer le nom d'utilisateur et le mot de passe au serveur.

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

Vous pouvez ensuite implémenter le délégué suivant pour vérifier la réponse

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

J'espère que cela t'aides.

8
Vaishnavi Naidu

Pour déboguer les problèmes HTTP, votre meilleur pari est d'obtenir l'application Charles proxy HTTP - elle enregistrera toutes les communications HTTP vers et depuis un serveur, via le simulateur (et vous pouvez même la définir comme proxy pour le téléphone si vous en avez besoin).

Ensuite, utilisez le programme Curl (depuis Terminal, il est intégré) pour générer une demande de publication de travail (vous devrez rechercher en ligne des exemples d'utilisation de CURL). Ensuite, vous comparez simplement la façon dont une demande de travail de CURL est formatée, à ce que votre application envoie ... notez que le simulateur est automatiquement redirigé pour fonctionner via Charles, vous devez indiquer à curl l'adresse proxy à utiliser pour envoyer les choses. par Charles.