Подтвердить что ты не робот

Отправка данных POST с iphone через SSL HTTPS

Все,

В моем проекте iphone мне нужно передать имя пользователя и пароль веб-серверу, ранее я передавал данные с использованием метода GET и использовал URL-адрес с GET-форматом (например: localhost: 8888/login? userName = admin & password = пароль), но теперь мне нужно отправить это как данные POST,

может ли кто-нибудь помочь мне найти то, что неправильно в этом коде ниже?

код, который я пробовал..


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

эта страница вернет успех или не сработает с использованием php echo

4b9b3361

Ответ 1

Вы отправляете запрос как NSASCIIStringEncoding, но ищете NSUTF8StringEncoding

Я бы установил

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

и

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

однако, как отметил Николай, это было бы легче, если бы мы знали, что такое ошибка: -)

Ответ 2

Наконец-то я получил способ отправить данные через безопасное соединение с 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);

чтобы избежать предупреждения, добавьте


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

Предоставлено:

Ответ 3

Ну, это точно не ответ на ваш вопрос. Но в качестве альтернативы взгляните на этот код. Я использую это для отправки имени пользователя и пароля на сервер.

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

Затем вы можете реализовать следующий делегат, чтобы проверить ответ

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

Надеюсь, что это поможет.

Ответ 4

Чтобы отлаживать проблемы с HTTP, лучше всего получить Charles HTTP-прокси-приложение - он будет записывать все HTTP-сообщения и с сервера, через симулятор (и вы даже можете установить его как прокси для телефона, если вам нужно).

Затем используйте программу Curl (из терминала, она встроена), чтобы сгенерировать рабочий запрос на публикацию (вам нужно искать в Интернете примеры использования CURL). Затем вы просто сравниваете, как отформатирован рабочий запрос от CURL, к тому, что отправляет ваше приложение... обратите внимание, что симулятор автоматически перенаправляется для работы через Чарльза, вы должны сказать, что прокси-адрес используется для передачи отправленных сообщений через Чарльза.