2010-09-10 72 views
0

嘿,所有!我从http://deusty.blogspot.com/2006/11/sending-http-get-and-post-from-cocoa.html读了一篇文章,但我没有得到一些东西。我试图用它建立NSURLConnection,还有一些它根本不会接收数据?如果您对这里感兴趣,我正在尝试登录www.lockerz.com网站。从Cocoa发送POST表单

http://pastebin.com/8fP9TX8q。修复链接,因为我不能发布超过1

它实际上说的连接失败,我不知道为什么...

回答

7

问题#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)会产生错误。

+0

我试过了,但现在我被带到他们的错误页面,告诉出错了,如果你真的那么友好,你能看看网站的开始页面,看看我该怎么做表格? – 2010-09-10 15:57:17

+0

哇,这是如此的最酷的答案之一 – Vojto 2010-09-10 15:58:49

+0

我已经修复了这些东西,并实现了代表,但它会把我带到错误页面而不是移动到主页面,如果连接想要如何实际处理重定向去做吧。 – 2010-09-10 16:14:51