2011-11-07 134 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