将 JSON 与 xcode 一起使用(从数据库返回用户信息)

Posted

技术标签:

【中文标题】将 JSON 与 xcode 一起使用(从数据库返回用户信息)【英文标题】:Using JSON with xcode (return user information from database) 【发布时间】:2014-09-13 06:57:01 【问题描述】:

我正在尝试创建登录过程(目前正在运行),同时,我想“加载”用户统计信息(这些统计信息在我的数据库中)。我正在尝试使用 JSON,但我不是这门语言的专家,我需要一些帮助。

首先,我想知道我这样做是否正确,因为它没有返回任何值(NULL)。你可以看到我的php文件,其中设置了JSON代码。

一切正常吗?如何使用 JSON 将值传递给 xcode? 就像我说的,我需要一些帮助,因为我从来没有使用过 JSON,而且我不确定我这样做是否正确。

这是我的登录 PHP 文件:(当用户点击“登录”按钮时它会启动)。

    <?php
header('Content-type: application/json');
if($_POST) 

    $DB_HostName = "localhost";
    $DB_Name = "db";
    $DB_User = "user";
    $DB_Pass = "pass";

    $userName = $_POST["username"];
    $password = $_POST["password"];

    $sql = "select * from user where userName = '$userName' and password = '$password';";
    $con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error());

    mysql_select_db($DB_Name,$con) or die(mysql_error());

    $res = mysql_query($sql,$con) or die(mysql_error());
    $res1 = mysql_num_rows($res);

    if ($res1>0)
    
        //
        $query = mysql_query("select * from user where userName = '$userName' and password = '$password';");
        while ($row = mysql_fetch_array($query))
        
            $id=$row['userID'];
        
        $query2 = mysql_query("select * from user_stats where userID = '$id';");
        while ($row2 = mysql_fetch_array($query2))
        
            $followers=$row2['followers'];
            $stars=$row2['stars'];
            $photos=$row2['photos'];
            $data=$followers.'-'.$stars.'-'.$photos;
        
        //die(json_encode(array("message" => "Getting user information succeeded.", "status" => '"success":1', "data" => $data), JSON_PRETTY_PRINT));
        //
        echo '"success":1,"data":'.$data.'';
    
    else
    
        echo '"success":0,"error_message":"Username and/or password is invalid.1"';
    

else

    echo '"success":0,"error_message":"Username and/or password is invalid.2"';

ViewController.m

- (IBAction)loginClicked:(id)sender 
@try 

    if([[_txtUsername text] isEqualToString:@""] || [[_txtPassword text] isEqualToString:@""] ) 
        [self alertStatus:@"Porfavor, introduce el usuario y contraseña" :@"Error"];
     else 
        NSString *post =[[NSString alloc] initWithFormat:@"username=%@&password=%@",[_txtUsername text],[_txtPassword text]];
        NSLog(@"PostData: %@",post);

        NSURL *url=[NSURL URLWithString:@"http://autograpp.com/login.php"];

        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

        NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:url];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:postData];

        [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

        NSError *error = [[NSError alloc] init];
        NSHTTPURLResponse *response = nil;
        NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        NSLog(@"Response code: %ld", (long)[response statusCode]);
        if ([response statusCode] >=200 && [response statusCode] <300)
        
            NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
            NSLog(@"Response ==> %@", responseData);

            SBJsonParser *jsonParser = [SBJsonParser new];
            NSDictionary *jsonData = (NSDictionary *) [jsonParser objectWithString:responseData error:nil];
            NSLog(@"%@",jsonData);
            NSInteger success = [(NSNumber *) [jsonData objectForKey:@"success"] integerValue];
            NSLog(@"%ld",(long)success);

            NSString *data = [(NSNumber *) [jsonData objectForKey:@"data"] stringValue];
            NSLog(@"%@",data);

            if(success == 1)
            
                NSLog(@"Login SUCCESS");
                //[self alertStatus:@"Bienvenido a Autograpp." :@"Datos correctos"];
                [self performSegueWithIdentifier:@"Main" sender:self];

             else 

                NSString *error_msg = (NSString *) [jsonData objectForKey:@"error_message"];
                [self alertStatus:error_msg :@"Datos incorrectos"];
            
            /*
            NSString *jsonString = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
            NSData *JSONdata = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
            NSError *jsonError = nil;
            if (JSONdata != nil) 
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:JSONdata options:0 error:&jsonError];
                if (jsonError == nil) 
                    // Set your text fields here.
                    NSLog(@"%@",dic);
                
            
            */

         else 
            if (error) NSLog(@"Error: %@", error);
            [self alertStatus:@"Ha ocurrido un problema inesperado" :@"Error"];
        
    

@catch (NSException * e) 
    NSLog(@"Exception: %@", e);
    [self alertStatus:@"Error." :@"Error"];

问题是:当我尝试从 JSON 中读取值时,它们为 NULL。我认为这是因为我不是使用 JSON 代码的专家,并且出现了问题。

提前致谢。

【问题讨论】:

你有什么问题? 问题是:当我尝试从 JSON 中读取值时,它们为 NULL。我认为这是因为我不是使用 JSON 代码的专家并且有问题。你能帮助我吗?谢谢 N.A 在 post 方法中你看不到响应 【参考方案1】:

做这样的事情

NSString *link = [NSString stringWithFormat:@"http://autograpp.com/login.php"];


    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:link]];
    [request setRequestMethod:@"POST"];
    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    [request addRequestHeader:@"Accept" value:@"application/json"];

    [request setPostValue:[NSString stringWithFormat:@"%@",  _txtUsername.text] forKey:@"username"];
    [request setPostValue:[NSString stringWithFormat:@"%@",  _txtPassword.text] forKey:@"password"];


    [request startSynchronous];

    NSError *error = [request error];
    if (!error) 
        NSString *jsonString = [request responseString];
        if(kShowLog)
            NSLog(@"response: %@", jsonString);
        NSDictionary * returnDict = (NSDictionary *) [jsonString JSONValue];

【讨论】:

我试过你的代码,但我有很多错误。 “使用未声明的标识符 *request”。谢谢 N.A. 还有另一个问题:我的 PHP(JSON 代码)是否正确? 您必须根据自己的需要进行修改。对于 json,您无法在浏览器中检查响应。如果您想查看您的 json 对于 POST 是否正确。你可以看到用于 json 视图的 chrome 插件 再次感谢 N.A. 你说我必须根据我的项目更改代码,但我有点迷茫。什么是 ASIFormDataRequest?你能帮我完成我的项目吗?因为我不确定我是否正确返回了 JSON,而且我不知道如何从 xcode 读取值。谢谢。

以上是关于将 JSON 与 xcode 一起使用(从数据库返回用户信息)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将参数化的测试用例数据与 Xcode 的 XCTest 框架一起使用?

将 xcodebuild 与 iOS 项目和 iOS 模拟器一起使用

将 Git 与现有 Xcode 项目一起使用

如何将 Xcode 与克隆的 git 存储库一起使用

尝试将 IQKeyboardManager 与 Xcode 和 Swift 一起使用时出错

将Cocoapods与App Extension一起使用