问题#1
东西马上给我的印象是错误的前两行:
NSString *post = @"[email protected]&password-password=testpassword";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
当提交POST表单(以及URL中的GET参数)时,只有键和值应该是URL编码的。在这里,您不仅可以对键和值进行编码,还可以对=
和&
进行编码,这显然是错误的。我通常做这样的事情:
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
[parameters setObject:@"[email protected]" 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编码here。
问题#2
你永远不会等待连接发送。 NSURLConnection
,您使用它的方式是异步 API。因此,下面将失败:
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection) {
NSLog(@"Connection succeeded!");
}
什么你正在测试没有连接成功完成,但成功实例化一个连接对象的。这是一个非常非常不同的事情。连接本身可能实际上并未完成几次运行循环的自旋。如果你希望连接是同步的(例如,连接在下一行代码执行之前完成),那么你需要使用NSURLConnection
's synchronous 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)会产生错误。
我试过了,但现在我被带到他们的错误页面,告诉出错了,如果你真的那么友好,你能看看网站的开始页面,看看我该怎么做表格? – 2010-09-10 15:57:17
哇,这是如此的最酷的答案之一 – Vojto 2010-09-10 15:58:49
我已经修复了这些东西,并实现了代表,但它会把我带到错误页面而不是移动到主页面,如果连接想要如何实际处理重定向去做吧。 – 2010-09-10 16:14:51