Отправка формы POST из Какао - PullRequest
0 голосов
/ 10 сентября 2010

Привет всем!Я прочитал статью от http://deusty.blogspot.com/2006/11/sending-http-get-and-post-from-cocoa.html, но некоторые вещи я не получил.Я пытался установить NSURLConnection с ним и некоторые, как он не будет получать данные вообще?Если вы заинтересованы здесь, я пытаюсь зайти на сайт www.lockerz.com.

http://pastebin.com/8fP9TX8q.Исправьте ссылки, так как я не могу публиковать более 1.

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

1 Ответ

7 голосов
/ 10 сентября 2010

Задача № 1

Что-то, что сразу кажется мне неправильным, это первые две строки:

NSString *post = @"email-email=test@email.com&password-password=testpassword";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

При отправке форм POST (и параметров GET в URL-адресе) должны быть закодированы только ключи и значения. Здесь вы не только кодируете ключи и значения, но также = и &, что просто неправильно. Я обычно делаю что-то вроде этого:

NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
[parameters setObject:@"test@email.com" forKey:@"email-email"];
[parameters setObject:@"testpassword" forKey:@"password-password"];

NSMutableArray * encodedParameters = [NSMutableArray array];
for (NSString * key in parameters) {
  NSString * value = [parameters objectForKey:key];
  NSString * encoded = [NSString stringWithFormat:@"%@=%@", [key stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding], [value stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
  [encodedParameters addObject:encoded];
}

NSString * post = [encodedParameters componentsJoinedByString:@"&"];
NSData * postData = [post dataUsingEncoding:NSASCIIStringEncoding];

Вы также можете столкнуться с проблемами при использовании stringByAddingPercentEscapesUsingEncoding:. Я написал NSString категорию о том, как URL кодировать строки здесь .

Задача № 2

Вы никогда не ожидаете отправки соединения. NSURLConnection в том виде, в каком вы его используете, - это асинхронный API. Таким образом, следующее не удастся:

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection) {
  NSLog(@"Connection succeeded!");
}

То, что вы тестируете, это не успешное завершение соединения, а успешное создание экземпляра объекта соединения . Это совсем другое. Само соединение может фактически не завершиться в течение нескольких вращений цикла выполнения. Если вы хотите, чтобы соединение было синхронным (т. Е. Соединение выполняется до выполнения следующей строки кода), вам необходимо использовать NSURLConnection синхронный API .

Задача № 3

Эти строки полны ошибок:

receivedData = [[NSMutableData data] retain];
NSString *text = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];

[NSMutableData data] возвращает пустой объект данных. В нем ничего нет . Поэтому, если вы создадите пустой объект данных, а затем создадите строку из данных, то (неожиданно для вас) вы получите пустую строку.

Кроме того, вы пропускаете объект данных (так как вы retain это [что не нужно], но никогда release это).

Редактировать , поскольку я чувствую себя щедрым ....

Следующее работает правильно (хотя я просто жестко запрограммировал строку HTTPBody вместо того, чтобы создать ее, как рекомендовано выше):

NSURL * url = [NSURL URLWithString:@"http://www.lockerz.com/auth/login/"];
NSMutableURLRequest * r = [[NSMutableURLRequest alloc] initWithURL:url];
[r setHTTPMethod:@"POST"];
[r setHTTPBody:[@"email%2Demail=test%40email%2Ecom&password%2Dpassword=testpassword" dataUsingEncoding:NSASCIIStringEncoding]];
[r setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

NSHTTPURLResponse * response = nil;
NSError * error = nil;
NSData * responseData = [NSURLConnection sendSynchronousRequest:r returningResponse:&response error:&error];
NSString * responseString = [[[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding] autorelease];
NSLog(@"%@", responseString);
[r release];

Это выполняется правильно, и responseString регистрирует некоторый HTML, который описывает страницу ошибки. Это, однако, неудивительно, поскольку сам URL (http://www.lockerz.com/auth/login) выдает ошибку при попытке использовать учетные данные, указанные в исходном вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...