Web services (5) - Trải nghiệm làm một web services (3)

Bài trước: Web services (4) - Trải nghiệm làm một web services (2)

-----

Xem lại cấu trúc thư mục của dự án chúng ta đang thực hiện,

/restapi/

-api/

-config/

                        --db.php

-model/

-view/

Ở phần đầu, chúng ta đã tạo tập tin index.html ngay trong thư mục gốc của dự án (restapi), nên khi muốn mở tập này chỉ cần nhập đường dẫn http://localhost/restapi/ là có thể mở tập tin index.html.

Trong phần này, chúng ta sẽ chuyển tập tin hiển thị (index.html) vào trong thư mục view. Nhìn cấu trúc thư mục, có thể nhận ra mô hình MVC (model-view-controller).

Để có thể vẫn chạy được tập tin index.html khi nhập đường dẫn http://localhost/restapi/, chúng ta cần tạo thêm tập tin .htaccess trong thư mục restapi, thiết lập tập tin này ở chế độ ẩn (hidden), và thêm vào nó dòng lệnh sau.

[.htaccess]

DirectoryIndex view/index.html


----

Cập nhật: 22/11/2023

Đọc thêm:

Web services (4) - Trải nghiệm làm một web services (2)

Bài trước: Web services (3) - Trải nghiệm làm một web services (1)

-----

Clip 4: Bài 3. Show API (https://www.youtube.com/watch?v=OH8D5pvHWIE&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=3)

Với phương thức GET, chúng ta có thể sử dụng trình duyệt để kiểm tra kết quả trả về của API. Tuy nhiên, với các phương thức POST, PUT/PATCH, DELETE thì phải sử dụng postman để kiểm tra.

Mối liên hệ giữa các phương thức của REST và thao tác CRUD:

GET – Read

POST – Create

PUT/PATCH – Update

DELETE – Delete

– Tải postman về máy và cài đặt

https://www.postman.com/downloads/

– Mở postman > tạo workspace > đặt tên bất kỳ (ví dụ RESTAPI)

– Thử nhập một REST API (ví dụ: http://localhost/restapi/api/questions/read.php) để kiểm tra. Bạn sẽ thấy kết quả giống như khi bạn gọi API trên trình duyệt. Xem hình minh họa.


– Trong model bổ sung thêm hàm show()

[model/questions.php]

  public function read(){

            $query = "SELECT * FROM cau_hoi ORDER BY id DESC";

            $stmt = $this->conn->prepare($query);

            $stmt->execute();

            return $stmt;

        }

 

        //show one item

        public function show(){

            $query = "SELECT * FROM cau_hoi WHERE id = ? LIMIT 1";

            $stmt = $this->conn->prepare($query);

            $stmt -> bindParam(1, $this->id);

            $stmt->execute();

 

            $row = $stmt -> fetch(PDO::ASSOC);

            $this -> noidung = $row['noidung'];

            $this -> A = $row['A'];

            $this -> B = $row['B'];

            $this -> C = $row['C'];

            $this -> D = $row['D'];

            $this -> dapan = $row['dapan'];

        }

– Trong api/questions, tạo thêm tập tin show.php

[api/questions/show.php]

<?php

header('Access-Control-Allow-Origin:*');

header('Content-Type: application/json');

 

include_once ("../../config/db.php");

include_once("../../model/questions.php");

$db = new db();

$connect = $db->connect();

$question = new Questions($connect);

// lấy giá trị id gửi lên từ client

$question->id = isset($_GET['id']) ? $_GET['id'] : die();

$question->show();

$item = array(

    'id' => $question->id,

    'A' => $question->A,

    'B' => $question->B,

    'C' => $question->C,

    'D' => $question->D,

    'dapan' => $question->dapan

);

print_r(json_encode($item));

?>

– Clip 5: https://www.youtube.com/watch?v=E5HABpEp0zc&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=2

–Tạo dữ liệu bằng REST API

Trong model/questions.php, tạo thêm hàm create().

[model/questions.php]

 // create data

        public function create(){

            $query = "INSERT INTO cau_hoi SET noidung=:noidung, A=:A, B=:B, C=:C, D=:D, dapan=:dapan";

            $stmt = $this->conn->prepare($query);

            // clean data

            $this -> noidung = htmlspecialchars(strip_tags($this->noidung));

            $this -> A =  htmlspecialchars(strip_tags($this->A));

            $this -> B =  htmlspecialchars(strip_tags($this->B));

            $this -> C =  htmlspecialchars(strip_tags($this->C));

            $this -> D =  htmlspecialchars(strip_tags($this->D));

            $this -> dapan =  htmlspecialchars(strip_tags($this->dapan));

            //bind data

            $stmt->bindParam(':noidung', $this->noidung);

            $stmt->bindParam(':A', $this->A);

            $stmt->bindParam(':B', $this->B);

            $stmt->bindParam(':C', $this->C);

            $stmt->bindParam(':D', $this->D);

            $stmt->bindParam(':dapan', $this->dapan);

 

            if($stmt->execute()){

                return true;

            }

 

            printf("Error %s.\n", $stmt->error);

            return false;

        }  

Trong api/questions tạo thêm tập tin create.php

[api/questions/create.php]

<?php

    header('Access-Control-Allow-Origin:*');

    header('Content-Type: application/json');

    header('Access-Control-Allow-Methods: POST');

    header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization, X-Request-With ');

 

    include_once ("../../config/db.php");

    include_once("../../model/questions.php");

   

    $db = new db();

    $connect = $db->connect();

    $questions = new Questions($connect);

 

    $data = json_decode(file_get_contents("php://input"));

 

    $questions->noidung = $data->noidung;

    $questions->A = $data->A;

    $questions->B = $data->B;

    $questions->C = $data->C;

    $questions->D = $data->D;

    $questions->dapan = $data->dapan;

 

    if($questions->create()){

        echo json_encode(array('message','Question created'));

    }else {

        echo json_encode(array('message', 'Question not created'));

    }

Để kiểm tra việc nhập dữ liệu từ cửa sổ trình duyệt, gửi về web server, lưu vào trong cơ sở dữ liệu chúng ta cần phải tạo form. Cách này mất nhiều thời gian.

Ở phần này, chúng ta sẽ sử dụng phần mềm Postman để nhập dữ liệu (thay cho form), sau đó gửi dữ liệu về web server, và lưu vào cơ sở dữ liệu.

Mở ứng dụng Postman và đền vào các thông tin cần thiết, xem hình minh họa.



Giải thích một số mục ở hình trên:

– Chọn phương thức gửi gói HTTP (phương thức của REST): POST

– URL để nhận yêu cầu và xử lý (đường dẫn của REST API): http://localhost/restapi/api/questions/create.php

– Nút gửi gói HTTP về web server (gọi REST API): Send

– Thiết lập các thông tin cho gói HTTP request (dữ liệu gửi về cho REST API): nhập thông tin cho trường Headers, trường body.

Trong trường Headers, nhập dữ liệu cho một mục “key:value” là “Content-Transfer-Encoding:appkication/json”

Trong trường body, nhập dữ liệu dạng JSON (đánh dấu vào mục chọn rawJSON):

{

    "noidung":"Câu 3. The format of a request HTTP includes?",

    "A":"A. Request line, Request message, Blank line, Request body",

    "B":"B. Request line, Request headers, Blank line, Request body",

    "C":"C. Request input, Request headers, Blank line, Request body",

    "D":"D. Request line, Request headers, Blank line, Request data",

    "dapan":"B"

}

Sau khi nhập dữ liệu xong, bấm nút Send để gửi gói HTTP request về URL tương ứng (thực thi lời gọi REST API).

Nếu REST API thực thi thành công, một dòng tin sẽ được thêm vào cơ sở dữ liệu, và web server sẽ trả về thông báo “thành công”.

Connected successfully[

    "message",

    "Question created"

]

Clip 6: Update và delete dữ liệu, https://www.youtube.com/watch?v=iyLMKJTBesw&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=1

– Cập nhật dữ liệu bằng REST API

Trong model/questions.php, tạo thêm hàm update().

[model/questions.php]

     …

        // update data

        public function update(){

            $query = "UPDATE cau_hoi SET noidung=:noidung, A=:A, B=:B, C=:C, D=:D, dapan=:dapan WHERE id=:id";

            $stmt = $this->conn->prepare($query);

            // clean data

            $this -> noidung = htmlspecialchars(strip_tags($this->noidung));

            $this -> A =  htmlspecialchars(strip_tags($this->A));

            $this -> B =  htmlspecialchars(strip_tags($this->B));

            $this -> C =  htmlspecialchars(strip_tags($this->C));

            $this -> D =  htmlspecialchars(strip_tags($this->D));

            $this -> dapan =  htmlspecialchars(strip_tags($this->dapan));

            $this -> id =  htmlspecialchars(strip_tags($this->id));

            //bind data

            $stmt->bindParam(':noidung', $this->noidung);

            $stmt->bindParam(':A', $this->A);

            $stmt->bindParam(':B', $this->B);

            $stmt->bindParam(':C', $this->C);

            $stmt->bindParam(':D', $this->D);

            $stmt->bindParam(':dapan', $this->dapan);

            $stmt->bindParam(':id', $this->id);

 

            if($stmt->execute()){

                return true;

            }

 

            printf("Error %s.\n", $stmt->error);

            return false;

        }

Trong api/questions tạo thêm tập tin update.php

[api/questions/update.php]

<?php

    header('Access-Control-Allow-Origin:*');

    header('Content-Type: application/json');

    header('Access-Control-Allow-Methods: PUT');

    header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization, X-Request-With ');

 

    include_once ("../../config/db.php");

    include_once("../../model/questions.php");

   

    $db = new db();

    $connect = $db->connect();

    $questions = new Questions($connect);

 

    $data = json_decode(file_get_contents("php://input"));

 

    $questions->id = $data->id;

    $questions->noidung = $data->noidung;

    $questions->A = $data->A;

    $questions->B = $data->B;

    $questions->C = $data->C;

    $questions->D = $data->D;

    $questions->dapan = $data->dapan;

 

    if($questions->update()){

        echo json_encode(array('message','Question updated'));

    }else {

        echo json_encode(array('message', 'Question not updated'));

    }

?>

[Postman], để ý thông tin ở các vùng tô đỏ trong hình dưới đây:

Bấm nút Send trên Postman, kiểm tra thông tin trong cơ sở dữ liệu sẽ thấy đã được cập nhật.

– Xóa dữ liệu bằng REST API

Trong model/questions.php, tạo thêm hàm delete().

[model/questions.php]

      … 

// delete data

        public function delete(){

            $query = "DELETE FROM cau_hoi WHERE id=:id";

            $stmt = $this->conn->prepare($query);

            // clean data

            $this -> id =  htmlspecialchars(strip_tags($this->id));

            //bind data

            $stmt->bindParam(':id', $this->id);

 

            if($stmt->execute()){

                return true;

            }

 

            printf("Error %s.\n", $stmt->error);

            return false;

        }

Trong api/questions tạo thêm tập tin delete.php

[api/questions/delete.php]

<?php

    header('Access-Control-Allow-Origin:*');

    header('Content-Type: application/json');

    header('Access-Control-Allow-Methods: DELETE');

    header('Access-Control-Allow-Headers: Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Methods, Authorization, X-Request-With ');

 

    include_once ("../../config/db.php");

    include_once("../../model/questions.php");

   

    $db = new db();

    $connect = $db->connect();

    $questions = new Questions($connect);

 

    $data = json_decode(file_get_contents("php://input"));

 

    $questions->id = $data->id;

 

    if($questions->delete()){

        echo json_encode(array('message','Question deleted'));

    }else {

        echo json_encode(array('message', 'Question not deleted'));

    }

?>

[Postman], để ý thông tin ở các vùng tô đỏ trong hình dưới đây:

Bấm nút Send trên Postman, kiểm tra thông tin trong cơ sở dữ liệu sẽ thấy dòng tin có id = 3 đã bị xóa.

-----