a-4-1-1.PHPでテストAPI(GET/POST/DELETE)を作成する。
目標設定
課題
- GETのAPIを作成できるか。
- GETのAPIでパラメーター取得はできるか。
- GETのAPIでJson形式の戻り値を作成できるか。
- POSTのAPIを作成できるか。
- POSTのAPIでBodyの配列情報を取得はできるか。
- DELETEのAPIを作成できるか。
- DELETEのAPIでBodyの情報を取得はできるか。
api2_get_test1_table.php
<?php
// 1. GETのAPIを作成できるか。
// ・可能でした。
// curl --include "http://localhost:8080/reversi/php/api2_get_test1_table.php?colum1=3"
// curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api2_get_test1_table.php?colum1=3"
// http://localhost:3000
/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
`COLUM1` INT NOT NULL PRIMARY KEY,
`COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/
require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
try {
// 2. GETのAPIでパラメーター取得はできるか。
// ・可能でした。
$colum1 = $_GET["colum1"];
if (!$colum1) {
http_response_code(400);
exit;
}
$sql = "SELECT * FROM TEST1_TABLE WHERE COLUM1 = :COLUM1;";
$statement = $pdo->prepare($sql);
$statement->bindParam(":COLUM1", $colum1, PDO::PARAM_INT);
$response = $statement->execute();
if ($response) {
$data = $statement->fetch();
}
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Methods: GET");
header("Access-Control-Allow-Headers: Content-Type, "
."Access-Control-Allow-Headers, Authorization, X-Requested-With");
// 3. GETのAPIでJson形式の戻り値を作成できるか。
// ・可能でした。
echo json_encode(array("data"=>$data ?: json_encode([], JSON_FORCE_OBJECT)),
JSON_UNESCAPED_UNICODE);
http_response_code(200);
} catch (PDOException $e) {
setDBErrorJson($e);
}
?>
api3_post_test1_table.php
<?php
/*
4. POSTのAPIを作成できるか。
・可能でした。
curl --include "http://localhost:8080/reversi/php/api3_post_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
"table1_values": [
{
"COLUM1": "3",
"COLUM2": "Value 3"
}
]
}'
curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api3_post_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
"table1_values": [
{
"COLUM1": "3",
"COLUM2": "Value 3"
}
]
}'
http://localhost:3000
*/
/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
`COLUM1` INT NOT NULL PRIMARY KEY,
`COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/
require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
$key = "table1_values";
$bodyStr = file_get_contents("php://input");
//var_dump($bodyStr);
$body = json_decode($bodyStr, true);
if (!array_key_exists($key, $body)) {
http_response_code(400);
exit;
}
// 5. POSTのAPIでBodyの配列情報を取得はできるか。
// ・可能でした。
$table1Values = $body[$key];
if (count($table1Values) == 0) {
http_response_code(400);
exit;
}
try {
$pdo->beginTransaction();
foreach($table1Values as $i => $colums) {
$sql = "INSERT INTO `TEST1_TABLE`(`COLUM1`, `COLUM2`) VALUES(:COLUM1, :COLUM2);";
$statement = $pdo->prepare($sql);
$statement->bindParam(":COLUM1", $colums["COLUM1"], PDO::PARAM_INT);
$statement->bindParam(":COLUM2", $colums["COLUM2"], PDO::PARAM_STR);
$statement->execute();
}
$pdo->commit();
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type, "
."Access-Control-Allow-Headers, Authorization, X-Requested-With");
http_response_code(200);
} catch (PDOException $e) {
$pdo->rollBack();
setDBErrorJson($e);
}
?>
api4_delete_test1_table.php
<?php
/*
6. DELETEのAPIを作成できるか。
・可能でした。
curl --include "http://localhost:8080/reversi/php/api4_delete_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
"table1_deleting_keys": [3]
}'
curl --include "https://wakizaka24.sakura.ne.jp/reversi/php/api4_delete_test1_table.php" \
-X POST -H "Content-Type: application/json" \
-d '{
"table1_deleting_keys": [3]
}'
http://localhost:3000
*/
/*
-- DROP TABLE IF EXISTS `TEST1_TABLE`;
CREATE TABLE `TEST1_TABLE` (
`COLUM1` INT NOT NULL PRIMARY KEY,
`COLUM2` VARCHAR(256) NULL
);
CREATE INDEX `TEST1_TABLE_COLUM1_INDEX`
ON `TEST1_TABLE`(`COLUM1`);
*/
require_once "include_security_review.php";
require_once "class_utils.php";
require_once "class_security_info.php";
$info = SecurityInfo::getDBConnectionInfo();
$pdo = new PDO($info["dns"], $info["username"], $info["password"],
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
$key = "table1_deleting_keys";
$bodyStr = file_get_contents("php://input");
//var_dump($bodyStr);
$body = json_decode($bodyStr, true);
if (!array_key_exists($key, $body)) {
http_response_code(400);
exit;
}
// 7. DELETEのAPIでBodyの情報を取得はできるか。
// ・可能でした。
$deletingKeys = $body[$key];
if (count($deletingKeys) == 0) {
http_response_code(400);
exit;
}
try {
$pdo->beginTransaction();
foreach($deletingKeys as $i => $key) {
$sql = "DELETE FROM `TEST1_TABLE` WHERE COLUM1=:COLUM1;";
$statement = $pdo->prepare($sql);
$statement->bindParam(":COLUM1", $key, PDO::PARAM_INT);
$statement->execute();
}
$pdo->commit();
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Methods: DELETE");
header("Access-Control-Allow-Headers: Content-Type, "
."Access-Control-Allow-Headers, Authorization, X-Requested-With");
http_response_code(200);
} catch (PDOException $e) {
$pdo->rollBack();
setDBErrorJson($e);
}
?>