2014-12-06 78 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