Invio di dati POST da iphone su SSL HTTPS

Hai tutto,

Nel mio progetto iphone ho bisogno di passare il nome utente e la password a un server web, in precedenza ho passato i dati utilizzando il metodo GET e ho usato l’url con il formato GET (ad esempio: localhost: 8888 / login? UserName = admin & password = password) ma ora i è necessario inviarlo come dati POST,

qualcuno può aiutarmi a trovare cosa c’è di sbagliato in questo codice qui sotto?

codice che ho provato ..


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

questa pagina tornerà utile o non funzionerà con php echo

Stai inviando la richiesta come NSASCIIStringEncoding ma stai cercando NSUTF8StringEncoding

Mi piacerebbe impostare

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

e

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

tuttavia, come ha notato Nikolai, sarebbe più facile se sapessimo quale fosse l’errore 🙂

Finalmente ho avuto modo di inviare dati tramite una connessione sicura da 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); 

per evitare un messaggio di avviso si prega di aggiungere


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

Cortesia:

  1. a tutti i miei stack overflow amici e sostenitori
  2. http://www.cocoadev.com/index.pl?HTTPFileUpload
  3. http://blog.timac.org/?tag=nsurlrequest

Bene, questa non è esattamente una risposta alla tua domanda. Ma in alternativa, date un’occhiata a questo codice. Uso questo con successo per l’invio di nome utente e password al server.

 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 

È quindi ansible implementare il seguente delegato per verificare la risposta

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 

Spero che questo ti aiuti.

Per eseguire il debug dei problemi HTTP, la soluzione migliore è ottenere l’app proxy HTTP Charles – registrerà tutte le comunicazioni HTTP da e verso un server, tramite il simulatore (e se necessario, puoi anche impostarlo come proxy per il telefono) .

Quindi, usa il programma Curl (da Terminale, è integrato) per generare una richiesta di lavoro (dovrai cercare online esempi di utilizzo di CURL). Quindi si confronta semplicemente come viene formattata una richiesta di lavoro da CURL, a ciò che l’applicazione sta inviando … si noti che il simulatore viene automaticamente reindirizzato per funzionare attraverso Charles, devi dire arricciare l’indirizzo proxy da utilizzare per avere le cose inviate attraverso Charles.