Я пытаюсь сделать REST API, который использует POST
создать новый объект в моей базе данных. Я использую рамки Slim.
Проблема в том, что я не уверен в том, что именно я должен поместить в эти строки на моем POST
метод:
$app->response->headers->set("Content-type","application/json");
$app->response->status(200);
$app->response->body(json_encode(**Here they put the name of the type of the object that they have in their database**));
Мой полный POST
Маршрут:
$app->post("/cars/", function() use($app)
{
$idCar = $app->request->post("idCar");
$name = $app->request->post("name");
try{
$connection = getConnection();
$dbh = $connection->prepare("INSERT INTO cars VALUES(?,?)");
$dbh->bindParam(1,$idCar);
$dbh->bindParam(2,$name);
$dbh->execute();
$connection = null;
$app->response->headers->set("Content-type","application/json");
$app->response->status(200);
$app->response->body(json_encode(**What I have to put here?**));
}catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
});
В таблице cars
есть объекты Car
,
Должен ли я сказать это так?
$app->response->headers->set("Content-type","application/json");
$app->response->status(200);
$app->response->body(json_encode($Car));
Я немного запутался, потому что в уроках, которые я видел раньше, в POST
Метод у них нет никакой ссылки на имя переменной внутри POST
маршрут. Например, если они используют $fruit
они не объявили ни одной переменной с именем $fruit
внутри их маршрута.
Что я должен делать? Мой ответ правильный?
Ответ прост: вы можете поставить что вы хотите в вашем ответе. Увидеть этот вопрос.
Это проблема дизайна, а не вопрос «правильности». Вы должны спросить себя, как вы собираетесь использовать API. Когда потребитель создаст объект, понадобится ли ему удобный способ доступа к нему снова (без необходимости искать его на основании каких-то других критериев)? В этом случае вы можете вернуть только id
объекта, который вы создали в своем ответе. Вы также можете вернуть весь объект в своем ответе, но будьте осторожны — в некоторых случаях в представлении базы данных может быть что-то Car
это не должно быть доступно конечному пользователю. Например, может быть, они должны увидеть Car
«s name
, make
, а также model
, но не его buyerSocialSecurityNumber
,
В любом случае вам нужно будет получить любую дополнительную информацию после запуска INSERT
запрос с другим запросом. Например, при условии, что есть больше информации, чем просто id
а также name
Я мог бы сделать что-то вроде:
$connection = getConnection();
$dbh = $connection->prepare("INSERT INTO cars VALUES(?,?)");
$dbh->bindParam(1,$idCar);
$dbh->bindParam(2,$name);
$dbh->execute();
$newCarId = $dbh->lastInsertId();
$car = $dbh->query("SELECT * FROM cars WHERE id = $newCarId");
$connection = null;
$app->response->headers->set("Content-type","application/json");
$app->response->status(200);
$app->response->body(json_encode($car));
Обратите внимание, что в этом случае можно интерполировать $newCarId
непосредственно в запрос, потому что это доверенный контент — т.е. не пользовательский ввод.
Других решений пока нет …