Задача № 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) выдает ошибку при попытке использовать учетные данные, указанные в исходном вопросе.