2014-12-06 139 views
0

我正在嘗試將數據發送到PHP Web服務器。如何通過PHP Web服務器URL傳遞數組?

NSString *urlString = [NSString stringWithFormat: @"xxxxx.com/dbfuncts.php?action=createuser&user=%@&pword=%@&fname=%@&lname=%@&email=%@[&team_id=team_id]", [newPerson objectForKey:@"ua_username"], [newPerson objectForKey:@"ua_password"], [newPerson objectForKey:@"ua_fname"],[newPerson objectForKey:@"ua_lname"], [newPerson objectForKey:@"ua_email"], @@@@@]; 
//The array goes where '@@@@@' is. 
NSURL *url = [NSURL URLWithString:urlString]; 
NSData* jsonData = [NSData dataWithContentsOfURL:url]; 
NSError *error; 
id userProfile = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; 


if(userProfile != nil){ 
    NSLog(@"%@", userProfile); 
    return userProfile; 
} else{ 
    NSLog(@"ERROR"); 
    return nil; 
} 

唯一的問題是,我不知道如何傳遞數組中的數據在url中。我怎麼做?

+0

您不應該爲此使用GET請求。普通密碼將記錄在服務器日誌等中。使用POST請求並在有效負載中發送數據。 – 2014-12-06 00:32:00

+0

你推薦什麼方法?我不確定在哪裏查找,因爲它使用了許多不同的答案。 – 2014-12-06 00:36:58

回答

1

對於這種情況,你應該使用AFNetworking

你剛纔設置的數組中的參數部分JSON,這就是所有的魔法。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
NSDictionary *params = @{@"width": width, @"weight": weight}; 
[manager POST:@"https://mysite.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

要阻止主線程的執行,直到操作完成,你可以做它添加到操作隊列之後[waitUntilFinished操作。在這種情況下,你不需要塊中的返回;設置__block變量就足夠了。所以你用專用方法包裝請求,並在調用它們之後執行waitUntilFinished。但我認爲,讓網絡同步並不是一個好主意。

在您的請求加載完成的整個過程中,您的應用程序似乎都會凍結 - 完全不響應觸摸和系統事件,直到請求結束。

至少,顯示一個加載模式,在請求結束之前不會關閉。更好的是,如果可能的話,使用戶可以在加載請求時正常地與應用程序交互。

編輯

如果你需要證明的東西,直到網絡工作,所以你需要做下面的步驟。首先,包裝你networkMethod:

- (void)postEventsWithHandler:(void (^)(BOOL isSuccess))handler 
{ 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
    NSDictionary *params = @{@"width": width, @"weight": weight}; 
    [manager POST:@"https://mysite.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
    handler(YES); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    Handler(NO) 
    }]; 
} 

然後你需要從你的類調用這個方法,在這種情況下,讓我們想象,我們有NetworkClass與所有網絡請求。

// SHOW modal popup or hud (BMProgressHUD for example) 
[NetworkClass postEventsWithHandlerWithHandler:^(BOOL isSuccess) { 
    // dismiss modal popup 
    // make something... 
    if (isSuccess) 
    { 

    } 
    else 
    { 

    } 
}]; 
+0

我之前使用過AFNetworking,但它異步運行,我需要它同步運行。 – 2014-12-06 01:00:27

+0

您不同步運行網絡請求。 – Andy 2014-12-06 01:44:58

+0

嗯....沒關係。這就說得通了。我在異步任務中遇到的唯一問題是測試數據不起作用。如何讓視圖控制器(加載屏幕)等待後臺線程完成? – 2014-12-06 01:45:06