2015-01-11 22 views
1

我是iOS開發新手,我被困在我的小型項目中,我必須創建異步POST請求到php網站。我在線閱讀資源,發現AFNetworking最好做這項工作,所以我通過終端使用cocoapods安裝了AFNetworking 2.4。我有一個視圖控制器有2個文本框(用戶名和密碼),每當我按下登錄按鈕,我發送一個異步的POST請求到php網站。POST請求必須包含參數'用戶名'和'密碼',並會收到JSON回覆「代碼」和「消息」。我必須在UIAlert中顯示解析的代碼和消息以及api調用花費的時間,以毫秒爲單位。唯一有效的登錄名是用戶名:Yomaki密碼:asdfgh。當登錄成功時,點擊UIAlert上的「確定」應該將我們帶回MainMenuViewController。請看下面我試過的代碼。我已經嘗試過以下幾個在線教程,但沒有奏效。AFNetworking用戶名和密碼參數的異步POST請求(Objective-C iOS)

請看看下面的代碼,

(IBAction)loginButton:(id)sender 

{ 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    NSDictionary *parameters = @{@"Yomaki": _usernameTextField, @"asdfgh": _passwordTextField}; 

    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"PHP URL HERE"]]; 
    AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

} 

請幫助我的代碼,因爲這是我第一次發送異步POST請求的PHP網站。

在此先感謝。

+1

思念是發送請求,也注意到, 「POST」 尚未指定。查看一些教程,介紹如何使用AFNetworking。 – zaph

+0

Zaph,感謝您的幫助,我確實檢查了一些教程,並更正了我需要的代碼。你也可以檢查一下我對Rob的評論,我真的不知道最近怎麼樣。你能幫忙嗎?在此先感謝並感謝您的幫助! –

+0

我通過添加下面的代碼來工作:code.manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@「text/html」]; –

回答

1

你不想使用_usernameTextField(在UITextField),而是_usernameTextField.text,或者更好,self.usernameTextField.text(該NSString是測試場的屬性)。密碼也是如此。

我還利用自己POST方法:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"userid": self.usernameTextField.text, @"password": self.passwordTextField.text}; 

[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

注意,在你的字典,你換下了場名稱(大概類似useridpassword,雖然與你的web服務的作者查)與什麼似乎是樣本userid /密碼值。我認爲你想恢復原來的字段名稱。

+0

謝謝了。好的,我按照你的建議進行了更正,並添加了你所說的代碼。由於某種原因,我仍然無法獲得我想要的那種迴應。當我在模擬器中按下登錄按鈕時,它根本沒有做任何事情,它也沒有給我寫在塊中的NSLog消息。如果你能告訴我如何創建一個警報,當不能登錄時會顯示消息,當我們輸入正確的密碼提示時,會顯示登錄成功的消息,並將我們帶回到根視圖控制器。謝謝您的幫助 !! –

+0

如果你沒有看到這兩個'NSLog'語句中的任何一個,這讓我懷疑它根本沒有達到這一點代碼。確保你的'IBAction'連接正確。在'POST'調用之前放置一個'NSLog'或斷點,這應該可以幫助您確認它沒有運行。 – Rob

+0

感謝您的幫助。我通過使用manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer。acceptableContentTypes setByAddingObject:@「text/html」]; –

0

來源:Junda Ong教程

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager POST:@"yourURL" 
    parameters: parameters 
     success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSLog(@"JSON: %@", responseObject); } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"Error: %@", error); 
     }]; 
+0

你好Zaph,謝謝你的幫助。我確實發佈了代碼,但是當我點擊模擬器中的登錄按鈕時,它沒有做任何事情。你能幫我確定什麼是錯的。它甚至不寫NSLog消息。你知道我怎麼能創建一個警告顯示錯誤的密碼,如果正確,在alertview上的確定按鈕將我們帶到rootviewcontroller。?提前致謝。 –

+0

基本調試是按順序進行的。代碼是否被調用?使用調試器和斷點,在m消息POST之前使用NSLog()。 – zaph

0
NSURL * url = @"your url"; 
NSString * user = ([userField.text length] == 0) ? @"" : userField.text; 
NSString * pass = ([passField.text length] == 0) ? @"" : passField.text; 

NSMutableDictionary * postVars = [NSMutableDictionary dictionary]; 

[postVars setObject:user forKey:@"username"]; 
[postVars setObject:pass forKey:@"password"]; 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager POST:url parameters:postVars success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    if ([responseObject isKindOfClass:[NSDictionary class]]){ 

     if ([responseObject objectForKey:@"code"]) && ([responseObject objectForKey:@"message"]){ 

      NSString * code = [responseObject objectForKey:@"code"]; 
      NSString * message = [responseObject objectForKey:@"message"]; 

     } 

    } 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    // something went wrong with your http post 

}];