0
0

More than 1 year has passed since last update.

a-4-1-1.PHPでテストAPI(GET/POST/DELETE)を作成する。

Last updated at Posted at 2023-08-30

a-4-1-1.PHPでテストAPI(GET/POST/DELETE)を作成する。

目標設定

一覧に戻る

課題

  1. GETのAPIを作成できるか。
  2. GETのAPIでパラメーター取得はできるか。
  3. GETのAPIでJson形式の戻り値を作成できるか。
  4. POSTのAPIを作成できるか。
  5. POSTのAPIでBodyの配列情報を取得はできるか。
  6. DELETEのAPIを作成できるか。
  7. 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);
}
?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0