У меня есть такой код:
$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");
Инициировать массив с пустыми значениями:
$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"
Часть, глядя на данные, кажется, что значения логически сгруппированы в базе данных (строка содержит связанные tc
, em
а также sg
ячеек), но вы разделяете их в 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()]);
Нет необходимости в итераторе, цикле и т. Д.
Возврат объекта ошибки сохраняет согласованность и легко поддается отслеживанию на стороне клиента:
Скажем, вы вернете это, если данные не найдены:
$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.
}