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

 Bài trước: Web services (2) - Hoạt động của web services

-----

1         Trải nghiệm làm một web services

1.1       Vừa học lý thuyết vừa làm ứng dụng cụ thể

Trước khi bắt đầu làm một web services, bằng cách ‘làm theo một cách máy móc’, chúng ta cùng nói sơ qua về phương pháp học. Nếu bạn đã đọc qua về Chu trình học tập Kolb, thì bạn sẽ thấy để thực sự làm việc được trong một lĩnh vực bất kỳ thì chúng ta phải trải qua cả 4 giai đoạn của quá trình học là [1] Trải nghiệm rời rạc (xem, nghe, đọc, làm theo), [2] Xâu chuỗi và hệ thống các khái niệm, [3] Ghi nhận tri thức vào bộ não, [4] Áp dụng tri thức vào thực tế, làm việc, vào việc học kiến thức mới.

Hiện nay, trên mạng đang có nhiều loạt bài hướng dẫn bạn từng bước để làm ra một ứng dụng hoàn chỉnh. Bạn làm theo và tạo ra một sản phẩm. Bạn đừng tự tin và cho rằng là mình đã có thể tự làm được một ứng dụng. Đó chỉ là trải nghiệm rời rạc. Bởi bạn phải làm theo y chang hướng dẫn, bạn không hiểu rất nhiều các thuật ngữ, khái niệm và vì vậy, nếu bắt bạn không xem hướng dẫn và làm lại một sản phẩm tương tự, thì bạn chẳng biết phải làm gì? bắt đầu từ đâu?

Một bạn học theo kiểu khác: tìm một lộ trình học (roadmap), hoặc tìm một (nhiều) sách được giới thiệu là đầy đủ mọi thứ và đọc, thực hành từng bước theo roadmap, theo sách. Sau 6 tháng, thấy mình chưa đi được đến đâu và lộ trình học còn rất dài, bắt đầu thấy hoang mang, nản và bỏ cuộc.

Vậy, sao chúng ta không kết hợp cả hai cách này lại với nhau. Học một chút lý thuyết nền tảng, bài bản; sau đó thử làm một ứng dụng thực tế (làm theo một cách máy móc). Chúng ta sẽ liên tục chuyển qua lại giữa hai hình thức này sẽ giúp bạn học nhanh, thích thú, tự tin hơn trong quá trình theo đuổi một lĩnh vực (làm phần mềm, làm web, làm ứng dụng di động, làm chuyên viên DevOps, làm game, làm chuyên viên kiểm thử, làm chuyên viên bảo mật chẳng hạn).

Nếu bạn muốn tìm hiểu thêm về những điều vừa trình bày, bạn có thể tìm kiếm các từ khóa phương pháp học top-down và bottom-up để đọc thêm và áp dụng cho bản thân.

1.2       Xem, làm theo và ghi chép

Quay trở lại nội dung của phần này, bạn lên youtube tìm kiếm một loạt bài hướng dẫn làm một web services cụ thể và làm theo. Tùy theo sở thích, khả năng, quỹ thời gian, khả năng ngoại ngữ, mục tiêu, để chọn loạt bài cho phù hợp.

Ví dụ, chúng ta có thể dùng từ khóa là ‘PHP REST API hướng dẫn’. Cách chọn từ khóa cũng là một kĩ năng cần học. Ở đây, chúng ta muốn tìm các ‘hướng dẫn’ về ‘REST API trên PHP’.

Bạn nào muốn tiến xa hơn, làm việc trong môi trường tiếng Anh thì học bằng tiếng Anh, từ khóa tìm kiếm là ‘PHP REST API tutorial’.

Để đơn giản, chúng ta sẽ bắt đầu bằng các bài giảng bằng tiếng Việt. Ví dụ, chúng ta sẽ làm theo loạt bài hướng dẫn của bạn Hiếu.

– Clip 1: Giới thiệu https://www.youtube.com/watch?v=mhZVpTT6xgE&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=8

Làm ứng dụng ‘Trắc nghiệm bằng lái xe A1’ áp dụng RESTful API, viết bằng ngôn ngữ PHP.

Vậy là chúng ta có thể sử dụng nhiều ngôn ngữ lập trình web back-end khác nhau để viết RESTful API. Ví dụ: PHP, Java, JavaScript, C#, Go, Ruby, Python.

API là viết tắt của Application Programming Interface, hiểu đơn giản là một hàm chức năng (function), nó làm một công việc cụ thể, có tên hàm, có truyền vào đối số, có trả về kết quả xử lý. Muốn sử dụng API nào thì gọi nó, truyền vào tham số và nhận kết quả trả về.

REST là viết tắt của REpresentational State Transfer, là một chuẩn (quy tắc), dùng để viết các API. Nếu dùng nó như một tính từ thì người ta thêm hậu tố ‘ful’ vào. Ý là viết API theo chuẩn REST.

– Clip 2: Kết nối cơ sở dữ liệu

https://www.youtube.com/watch?v=CeVAzP7DeLg&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=5

Thiết lập môi trường lập trình:

– Dùng XAMPP: để có phần mềm web server (Apache), phần biên dịch mã nguồn PHP.

– Dùng VS code để viết mã nguồn

– Dùng Postman để kiểm tra API, có thể dùng online

– Tạo thư mục dự án

/restapi/

-api/

-config/

                        --db.php

-model/

-view/

[db.php]

// connect database based PDO (mysql, mysqli)

<?php

    $servername = "localhost";

    $username = "username";

    $password = "password";

   

    try {

      $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);

      // set the PDO error mode to exception

      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      echo "Connected successfully";

    } catch(PDOException $e) {

      echo "Connection failed: " . $e->getMessage();

    }

?>

– Khi làm việc với mysql bằng phpmyadmin, chúng ta để ý tới tập tin cấu hình một số thông tin quan trọng, có tên là config.inc.php. Xem hình minh họa.


Vị trí của tập tin config.inc.php tại C:\xampp\phpMyAdmin

[config.inc.php]

/* Authentication type and info */

$cfg['Servers'][$i]['auth_type'] = 'config';

$cfg['Servers'][$i]['user'] = 'root';

$cfg['Servers'][$i]['password'] = '';

$cfg['Servers'][$i]['extension'] = 'mysqli';

$cfg['Servers'][$i]['AllowNoPassword'] = true;

$cfg['Lang'] = '';

 

/* Bind to the localhost ipv4 address and tcp */

$cfg['Servers'][$i]['host'] = 'localhost';

$cfg['Servers'][$i]['connect_type'] = 'tcp';

[Lỗi xảy ra khi mở phpmyadmin bằng trình duyệt]


Lý do lỗi: trước đó, chúng ta đã dùng console để đổi mật khẩu của root,

mysql> alter user 'root'@'localhost' identified by '123456';

Query OK, 0 rows affected (0.06 sec)

Tuy nhiên, trong tập tin config.inc.php, lại để password là trắng (''), vì vậy đã sinh ra lỗi.

Cách sửa: cập nhật mật khẩu mới đổi vào trong tập tin config.inc.php.

$cfg['Servers'][$i]['password'] = '123456';

Tạo cơ sở dữ liệu trong mysql bằng phpmyadmin


Tạo trang index.html

[index.html]

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Trắc nghiệm</title>

</head>

<body>

    <h1>Chương trinh trac nghiem</h1>

</body>

</html>

Chạy thử trang index trên trình duyệt, nếu không có lỗi là được. Nhập đường dẫn sau vào trình duyệt để xem kết quả.

http://localhost/restapi/

Chỉnh sửa lại tập tin db.php

[db.php]

<?php
// connect database based PDO (mysql, mysqli)
class db {
    private $servername = "localhost";
    private $username = "root";
    private $password = "123456";
    private $conn;
    public function connect(){
        $this->conn = null;
        try {
            $this->conn = new PDO("mysql:host=".$this->servername.";dbname=restapi_tracnghiem", $this->username, $this->password);
            // set the PDO error mode to exception
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connected successfully";
          } catch(PDOException $e) {
            echo "Connection failed: " . $e->getMessage();
          }
        return $this->conn;
    }
}
?>

Sử dụng trình duyệt, chạy tập tin db.php để kiểm tra xem việc kết nối với cơ sở dữ liệu được chưa? Nhập vào trình duyệt đường dẫn sau:

http://localhost/restapi/config/db.php

Kết quả xuất ra trình duyệt câu thông báo thành công là được.

Connected successfully

– Trong thư mục api, tạo thư mục questions. Trong thư mục questions, tạo API có tên là read.php.

– Clip 3: https://www.youtube.com/watch?v=ghTIs4BgIrA&list=PLWTu87GngvNzMPnMblh89ljiGBI9qhviC&index=4

Mở trình duyệt, mở trang http://localhost/restapi/api/questions/read.php để quan sát kết quả trong khi lập trình.

Định dạng dữ liệu trả về của read.php là JSON

[read.php]

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

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

Trong model, tạo thêm tập tin questions.php

[model/questions.php]

<?php

    class Questions {

        private $conn;

       

        // question properties

        public $id;

        public $noidung;

        public $A;

        public $B;

        public $C;

        public $D;

        public $dapan;

 

        // connect db

        public function __construct($db){

            $this->conn = $db;

        }

 

        //read data

        public function read(){

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

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

            $stmt->execute();

            return $stmt;

        }

    }

?>

Viết controller read.php.

[api/questions/read.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();

    $questions = new Questions($connect);

    $read = $questions->read();

 

    $num = $read->rowCount();

   

    if($num > 0) {

        $question_arr = [];

        $question_arr['data'] = [];

 

        while($row = $read->fetch(PDO::FETCH_ASSOC)){

            extract($row);

 

            $question_item = array(

                'id_question' => $id,

                'A' => $A,

                'B' => $B,

                'C' => $C,

                'D' => $D,

                'dapan' => $dapan

            );

            array_push($question_arr['data'], $question_item);

        }

        print_r($question_arr);

        echo json_encode($question_arr);

    }

 

?>

– $row = $read->fetch(PDO::FETCH_ASSOC): đọc một hàng dữ liệu từ kết quả truy vấn, trả về mảng ($row) kiểu key=>value

extract($row): phân rã cặp key=>value của mỗi phần tử mảng thành dạng $key = value.

Ví dụ: $row = array(“ten” => “teo”, “tuoi” => 12)

$row = Array

(

    [id] => 2

    [noidung] => Câu 2. In a Web service a Web technology such as HTTP is used for transferring _________ file formats such as XML and JSON

    [A] => A. HTML

    [B] => B. HTTP

    [C] => C. human-readable

    [D] => D. machine-readable

    [dapan] => D

)

Sau lệnh extract($row) sẽ thành:

$id = 2

$noidung = “Câu 2. ….”

$A = “A. HTML”

….

$dapan = “D”.

Clip 4:

-----