ทำ Mock API ด้วย json-server

API Apr 8, 2023

ปกติถ้าเราทำงาน Frontend การที่เราจะทำการดึงข้อมูล API เราจำเป็นต้องรอให้ฝั่ง Backend ทำ API ให้เสร็จ ถึงจะเทสได้ ทีนี้ ถ้าเราอยากเทส API เอง หรืออยากทำ Propotype ก่อน โดยที่ไม่ต้องพึ่งพา Backend เราก็ต้องหา Fake API / mock API ต่างๆ เช่น

DummyJSON - Fake REST API of JSON data for development
Different types of REST Endpoints filled with JSON data to use in developing the frontend without worrying about writing a backend.
JSONPlaceholder - Free Fake REST API

แต่วันนี้จะมาแนะนำ json-server ซึ่งเป็นตัวเดียวกับที่ JSONPlaceholder ใช้นั่นเอง

GitHub - typicode/json-server: Get a full fake REST API with zero coding in less than 30 seconds (seriously)
Get a full fake REST API with zero coding in less than 30 seconds (seriously) - GitHub - typicode/json-server: Get a full fake REST API with zero coding in less than 30 seconds (seriously)

1. ติดตั้ง JSON Server

npm install -g json-server

2. สร้าง db

ขั้นต่อมา ทำการสร้าง db เป็น JSON โดยสมมติ ตั้งชื่อว่า db.json  ข้างใน มีข้อมูล 2 ส่วนคือ posts และ users ตัวอย่างข้อมูลใน db.json

{
    "posts":
    [
        {
            "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto",
            "id": 1,
            "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
            "userId": 1
        },
        {
            "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla",
            "id": 2,
            "title": "qui est esse",
            "userId": 1
        },
        {
            "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut",
            "id": 3,
            "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
            "userId": 1
        },
        {
            "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit",
            "id": 4,
            "title": "eum et est occaecati",
            "userId": 1
        },
        {
            "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque",
            "id": 5,
            "title": "nesciunt quas odio",
            "userId": 1
        }
    ],
    "users":
    [
        {
            "email": "Sincere@april.biz",
            "id": 1,
            "name": "Leanne Graham",
            "username": "Bret"
        },
        {
            "email": "Shanna@melissa.tv",
            "id": 2,
            "name": "Ervin Howell",
            "username": "Antonette"
        },
        {
            "email": "Nathan@yesenia.net",
            "id": 3,
            "name": "Clementine Bauch",
            "username": "Samantha"
        },
        {
            "email": "Julianne.OConner@kory.org",
            "id": 4,
            "name": "Patricia Lebsack",
            "username": "Karianne"
        },
        {
            "email": "Lucio_Hettinger@annie.ca",
            "id": 5,
            "name": "Chelsey Dietrich",
            "username": "Kamren"
        },
        {
            "email": "Karley_Dach@jasper.info",
            "id": 6,
            "name": "Mrs. Dennis Schulist",
            "username": "Leopoldo_Corkery"
        },
        {
            "email": "Telly.Hoeger@billy.biz",
            "id": 7,
            "name": "Kurtis Weissnat",
            "username": "Elwyn.Skiles"
        },
        {
            "email": "Sherwood@rosamond.me",
            "id": 8,
            "name": "Nicholas Runolfsdottir V",
            "username": "Maxime_Nienow"
        },
        {
            "email": "Chaim_McDermott@dana.io",
            "id": 9,
            "name": "Glenna Reichert",
            "username": "Delphine"
        },
        {
            "email": "Rey.Padberg@karina.biz",
            "id": 10,
            "name": "Clementina DuBuque",
            "username": "Moriah.Stanton"
        }
    ]
}

3. Start Server

ทำการ start server โดย watch ที่ไฟล์ db.json

json-server --watch db.json

จะเห็น output แสดง information ต่างๆ ของ json server

ตัว JSON Server มันจะ mapping resources จากข้อมูลใน db.json ของเรา ซึ่งเรามี array ของ posts และ users ทั้งสอง array ก็กลายเป็น url

  • http://localhost:3000/posts
  • http://localhost:3000/users

ส่วน ถ้าอยากเข้าถึง id ก็จะเป็น /posts/:id และ /users/:id

4. Basic CRUD

ตัวอย่าง resource สำหรับ CRUD จะถูก mapping เป็นแบบนี้

GET /posts   		-> รายชื่อ posts ทั้งหมด
GET /posts/:id		-> ข้อมูล post by id
POST /posts			-> เพิ่มข้อมูล post
PUT /posts/:id		-> update post
DELETE /posts/:id	-> ลบ post ด้วย id

// ของ users ก็เช่นเดียวกันกับ posts
GET /users
GET /users/:id
POST /users
PUT /users/:id
DELETE /users/:id

GET

ทดลองยิง GET เพื่อดึงข้อมูล posts ทั้งหมด และ post by id

GET http://localhost:3000/posts
GET http://localhost:3000/posts/1

POST

การยิง POST request ลองทดสอบผ่าน Postman หรือใช้ cURL โดยข้อมูลที่เป็น body payload ที่เราต้องการ ถ้าเราไม่ได้ใส่ id ตัว json server จะ auto generate id ให้เราเอง ตัวอย่าง สมมติ ผมอยากเพิ่มข้อมูล users ไปเพิ่ม ซึ่งมันมี schema แบบนี้

{
  "email": "myemail@example.com",
  "name": "Chuck Norris",
  "username": "chuck"
}

ทดลองส่ง POST เพื่อเพิ่มข้อมูล ผ่าน cURL (หรือใช้ Postman ก็ได้)

curl -L -X POST 'http://localhost:3000/users' \
-H 'Content-Type: application/json' \
--data-raw '{
  "email": "myemail@example.com",
  "name": "Chuck Norris",
  "username": "chuck"
}'

เมื่อเพิ่มข้อมูลแล้ว ลองทดสอบ ด้วยการ GET http://localhost:3000/users/11 เราจะเห็นข้อมูลที่เราเพิ่งเพิ่มลงไป

PUT

การอัพเดทข้อมูล เราก็ยิง PUT Requeset ไปที่ /users/:id ที่เราต้องการอัพเดท พร้อมด้วย body ที่เราต้องการอัพเดท ตัวอย่าง

curl -L -X PUT 'http://localhost:3000/users/11' \
-H 'Content-Type: application/json' \
--data-raw '{
  "email": "chuck@norris.com",
  "name": "Chuck Norris",
  "note": "updated!"
}'

DELETE

ลบข้อมูล ก็ใช้ DELETE ไปที่ /users/:id ตัวอย่าง

curl -X DELETE http://localhost:3000/users/13

Filter & Pagination

เราสามารถ filter หรือทำ pagination ได้ด้วย โดยกำหนดว่า จะให้ return ข้อมูลทีละเท่าไหร่ page ไหน ตัวอย่าง การ filter ด้วยการใช้ query string ชื่อเดียวกับ json ของเรา

GET /posts?id=1&id=2
GET /users?email=chuck@norris.com

ตัวอย่างการทำ pagination โดยการส่ง query เป็น page และ limit

GET /users?_page=2
GET /users?_page=2&_limit=20

สามารถใช้ Sort ก็ได้

GET /users?_sort=username&_order=asc

หรือใช้ q เพื่อเป็น full text search

GET /posts?q=hello

สรุป ตัวอย่างโพสนี้ ก็เป็นเพียงแค่ Mock API แบบง่ายๆ นะครับ เป็น CRUD จากไฟล์ JSON ไม่ได้มี validation หรือ authentication อะไร แต่ตัว json server รองรับ สามารถทำได้ ยังไง ก็ลองไปอ่าน และศึกษาเพิ่มเติมดูนะครับ

GitHub - typicode/json-server: Get a full fake REST API with zero coding in less than 30 seconds (seriously)
Get a full fake REST API with zero coding in less than 30 seconds (seriously) - GitHub - typicode/json-server: Get a full fake REST API with zero coding in less than 30 seconds (seriously)

Happy Coding ❤️

Tags

Chai Phonbopit

เป็น Web Dev ทำงานมา 10 ปีหน่อยๆ ด้วยภาษา JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจ Web3, Crypto และ Blockchain เขียนบล็อกที่ https://devahoy.com