2011-11-07 42 views
1

目标是通过查询数据库进行简单的用户名/密码认证。直到连接工作体面我的PHP目标文件压根儿就下面的代码:异步POST到服务器

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,但我似乎无法获取数据了......或者我需要另一个委托方法?另外,它是如何'安全'是通过使用回声来检查查询结果(我是否需要/想要一个流可能?)?

蒂亚

EDIT

问题相关的服务器,而不是目标C代码。问到一个新的问题,以达到正确的观众:$_POST remaining empty

回答

2

@ott是在正确的轨道上,我会尽力澄清。

  1. 你不需要start他说。连接将自动启动,这是良性的。

  2. initWithRequest:delegateconnectionWithRequest:delegate:是等效的,除了新的connection对象的保留状态。

  3. 真正的问题是你正在使用的B/C connectionWithRequest:delegate返回的连接在运行循环结束时被自动释放,并且你不保留它在属性中。因此,连接永远不会启动。

的解决方案是一个属性@property (nonatomic, retain) NSURLConnection *connection这个属性添加到您的类并设置为从connection:withRequest:

返回然后释放完成方法connection:didFinishLoadingconnection:didFailWithError:连接的连接。

+0

我完全理解你在说什么。添加了@property并保留了NSURLConnection和connectionWithRequest:delegate: 但是,仍然出现PHP错误“未定义索引:电子邮件” – mmvie

+0

好了,这是您的服务器的响应,因此您需要从那里进行调试。无论是同步执行请求还是异步执行都无关紧要。看看你发布什么数据,并确保它是服务器需要的。我的答案是正确使用NSURLConnection。 – XJones

+0

是的。 看来我的$ _POST变量保持为空。使用print_r($ _ POST)来调试它。 – mmvie

0

start这里是错误的。简单使用

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

NSURLConnection *connection;定义。请参阅connectionWithRequest的课程参考。 startinitWithRequest:delegate:一起使用。

+0

好的,所以connectionWithRequest:delegate:开始加载URL请求的数据,不需要启动。 仍然收到“未定义的索引:电子邮件”作为一个PHP错误回来,这意味着POST变量没有被发现... – mmvie