Асинхронный POST к серверу - PullRequest
       26

Асинхронный POST к серверу

1 голос
/ 08 ноября 2011

Цель состоит в том, чтобы выполнить простую аутентификацию по имени пользователя / паролю путем запроса базы данных. Пока соединение не работает прилично, мой файл назначения php просто имеет следующий код:

echo "Posted: " . $_POST['email'];

Код, делающий это синхронно:

NSString *post = [[NSString alloc] initWithFormat:@"email=%@&password=%@", self.email.text, ..]; // .. simplified keychainItem
NSData *postEncoded = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
NSString *postLength = [NSString stringWithFormat:@"%d", [postEncoded length]];

NSURL *url = [NSURL URLWithString:@"http://eng.studev.groept.be/web2.0/a11_web02/improver/app/testPost"];

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

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

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

Правильное значение отображается как эхо. Но при попытке сделать это асинхронно, я получаю следующую ошибку php: «Неопределенный индекс: электронная почта». Я пытаюсь запустить асинхронный запрос с этой строки:

[[NSURLConnection connectionWithRequest:request delegate:self] start];

Затем у меня есть соединение с методом делегата: didReceiveResponse, но там я не могу получить данные ... Или мне нужен другой метод делегата? Кроме того, насколько «безопасно» проверять результат вашего запроса, используя только эхо (нужен ли мне / может быть нужен поток?) ??

Tia

EDIT

Проблема связана с сервером, а не с кодом Objective-C. Задал новый вопрос для охвата нужной аудитории: $ _ POST оставлено пустым

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

@ ott на правильном пути, я постараюсь уточнить.

  1. Тебе не нужно start, как он говорит. Это удобно, так как соединение начнется автоматически.

  2. initWithRequest:delegate и connectionWithRequest:delegate: эквивалентны, за исключением состояния сохранения нового объекта connection.

  3. Настоящая проблема в том, что вы используете б / к connectionWithRequest:delegate возвращаемое соединение автоматически освобождается в конце цикла выполнения, и вы не сохраняете его в свойстве. Поэтому соединение никогда не запускается.

Решение состоит в том, чтобы добавить свойство @property (nonatomic, retain) NSURLConnection *connection в ваш класс и установить это свойство для соединения, возвращаемого из connection:withRequest:

Затем вы освобождаете соединение в методах завершения connection:didFinishLoading и connection:didFailWithError:.

0 голосов
/ 08 ноября 2011

start здесь не так.Просто используйте

self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

с определением NSURLConnection *connection;.См. Ссылку на класс для connectionWithRequest.start должен использоваться с initWithRequest:delegate:.

...