-3

我有这样的代码:

$iterator = 0;
while (($end = $sth->fetch()) && $iterator < 2)
{
    $api_arr["data"]['tc'][] =  $end["tc"];
    $api_arr["data"]['em'][] =  $end["em"];
    $api_arr["data"]['sg'][] =  $end["sg"];

    $iterator ++;
}

我正在为其他开发人员创建我的网站的 API。我给他们一个 JSON 输出。像这样的东西:

{
   -data{
       tc: [
         "value_tc_1",
         "value_tc_2",
         "value_tc_3" 
       ],

       em: [
         "value_em_1",
         "value_em_2",
         "value_em_3" 
       ],

       sg: [
         "value_sg_1",
         "value_sg_2",
         "value_sg_3" 
       ]
   }
}

当前输出:( 当没有任何行时$sth->rowCount() == ''

[]

我想要什么:( 当没有任何行时$sth->rowCount() == ''

{
   -data{
       tc: [false],
       em: [false],
       sg: [false]
   }
}

好吧,我该怎么做?


作为咨询:false没有结果时是否必须设置为数组的值?我从未有过创建 API 的经验。我想false根据一些类似的API (来自其他网站)进行设置。

实际上,我想向其他开发人员展示一个可用的标准。那么,作为 API,我所做的是正确的吗?其他开发者能用吗?

我不知道,也许我需要的是这个:

{
   -data{
       tc: false,
       em: false,
       sg: false
   }
}

一般来说,有什么我需要知道的吗?{预先感谢:)}


我尝试了什么:我认为这样的东西会很有用,但实际上我不知道应该如何使用它:

array_fill_keys(array_keys($api_arr['data']), "false");
4

2 回答 2

3

用空值初始化数组:

$iterator = 0;
$api_arr = [
    'data'=>
        [
            'tc'=>[],
            'em'=>[],
            'sg'=>[]
        ]
    ];

while (($end = $sth->fetch()) && $iterator < 2)
{
    $api_arr["data"]['tc'][] =  $end["tc"];
    $api_arr["data"]['em'][] =  $end["em"];
    $api_arr["data"]['sg'][] =  $end["sg"];

    $iterator ++;
}

如果数据库中没有结果,结果将是:

{
   data{
       tc: [],
       em: [],
       sg: []
   }
}

对于期望包含数组的数据结构的 API 使用者来说,这将是一致的。可能整个结构可以重构,但一致性是一个好的开始

部分扩展"the whole structure can be refactored",查看数据,似乎这些值在数据库中按逻辑分组(一行包含相关tcemsg单元格),但您在 API 中将它们分开却没有明确的原因。

更好的结构是遵循数据库的结构:

$iterator = 0;
$data = [];
while (($end = $sth->fetch()) && $iterator < 2)
{
    $data[] =  [
        'tc'=> $end["tc"],
        'em'=> $end["em"],
        'sg'=> $end["sg"]
   ];
    $iterator ++;
}
header('Content-Type: application/json');
echo json_encode([data=>$data]);

这将输出:

{
    data:[
       {tc: value_tc_1, em: value_em_1, sg: value_sg_1},
       {tc: value_tc_2, em: value_em_2, sg: value_sg_2},
       {tc: value_tc_3, em: value_em_3, sg: value_sg_3}
    ]
}

当您有结果时,并且:

{
    data:[]
}

没有结果的时候。

例如,消费者代码可以是(再次使用 php,可以是任何语言):

 $response = json_decode(file_get_contents($apiEndpoint));
 foreach($response->data as $element){
     echo '<tr><td>' . $element->tc . '</td><td>' . $element->em . '</td><td>' . $element->sg . '<td></tr>';
 }

而且无论您的 api 是否返回结果,消费者代码都可以正常运行(如果没有结果,则只显示一个空表)。

最后一点,如果您的 SQL 更具体地说明您想要什么,例如:

SELECT tc, em, sg FROM tablename LIMIT 3

然后你的整个php代码变成:

header('Content-Type: application/json');
echo json_encode([data=>$sth->fetchAll()]);

不需要迭代器,while循环等

于 2015-12-14T14:38:24.950 回答
1

返回错误对象保持一致性并且很容易在客户端捕获:

如果没有找到数据,假设你返回这个:

$api_arr["error"]["code"] = 404;
$api_arr["error"]["message"] = "No data found";

现在在客户端,在一个 ajax 请求中,有人可以很容易地做到这一点:

try {
   if(typeof ajaxObj.error != 'undefined'){
        throw ajaxObj.error;
   }

   //Data is found
} catch(errObj) {
   //Handle the error object.
}
于 2015-12-14T14:48:04.210 回答