API REST trong NodeJS là gì?

API REST là một cách tiêu chuẩn ngành để các dịch vụ web gửi và nhận dữ liệu. Chúng sử dụng các phương thức yêu cầu HTTP để tạo thuận lợi cho chu trình phản hồi yêu cầu và thường truyền dữ liệu bằng JSON và hiếm hơn - HTML, XML và các định dạng khác

Trong hướng dẫn này, chúng tôi sẽ xây dựng API REST để quản lý sách bằng Node. js và Express

Để đơn giản, chúng tôi sẽ không sử dụng cơ sở dữ liệu, vì vậy bạn không cần có kinh nghiệm sử dụng cơ sở dữ liệu. Thay vào đó, chúng tôi sẽ sử dụng một mảng JavaScript đơn giản để lưu trữ dữ liệu của mình

API REST là gì?

REST (Chuyển giao trạng thái đại diện) là một kiến ​​trúc tiêu chuẩn để xây dựng và giao tiếp với các dịch vụ web. Nó thường bắt buộc các tài nguyên trên web được thể hiện ở định dạng văn bản (như JSON, HTML hoặc XML) và có thể được truy cập hoặc sửa đổi bằng một tập hợp các hoạt động được xác định trước. Cho rằng chúng tôi thường xây dựng các API REST để tận dụng HTTP thay vì các giao thức khác, các hoạt động này tương ứng với các phương thức HTTP như GET, POST hoặc PUT

Trên một tập hợp dữ liệu, chẳng hạn như sách, có một vài hành động chúng ta sẽ cần thực hiện thường xuyên, đó là - Tạo, Đọc, Cập nhật và Xóa (còn được gọi là Chức năng CRUD)

API (Giao diện lập trình ứng dụng), như tên cho thấy, là một giao diện xác định sự tương tác giữa các thành phần phần mềm khác nhau. API Web xác định những yêu cầu nào có thể được thực hiện đối với một thành phần (ví dụ: điểm cuối để nhận danh sách sách), cách thực hiện chúng (ví dụ: yêu cầu GET) và phản hồi dự kiến ​​của chúng

Express là gì?

ExpressJS là một trong những thư viện máy chủ HTTP phổ biến nhất cho Node. js, theo mặc định không thân thiện với việc phát triển API. Sử dụng Express, chúng tôi đơn giản hóa quá trình phát triển API bằng cách trừu tượng hóa bản soạn sẵn cần thiết để thiết lập máy chủ, giúp quá trình phát triển nhanh hơn, dễ đọc hơn và đơn giản hơn. Bạn có thể tạo API nguyên mẫu trong vài giây và một vài dòng mã

Mặc dù mục đích sử dụng chính của nó là để đơn giản hóa mọi thứ với các giá trị mặc định hợp lý, nhưng nó có khả năng tùy biến cao bằng cách sử dụng các chức năng được gọi là "phần mềm trung gian"

API REST trong NodeJS là gì?

Ghi chú. Express rất nhẹ và được xây dựng trên phần mềm trung gian. Sử dụng phần mềm trung gian, bạn có thể mở rộng và mở rộng chức năng của nó ngoài các chức năng đã có theo mặc định

Mặc dù chúng tôi sẽ chỉ xây dựng API REST trong hướng dẫn này, nhưng khung ExpressJS không chỉ giới hạn ở điều đó - lưu trữ các tệp tĩnh, thực hiện kết xuất phía máy chủ hoặc thậm chí sử dụng nó làm máy chủ proxy không phải là hiếm và bầu trời

Các loại yêu cầu HTTP

Có một số loại HTTP method mà chúng ta cần nắm trước khi xây dựng một REST API. Đây là các phương thức tương ứng với các tác vụ CRUD

  • $ npm init -y
    
    9. Dùng để gửi dữ liệu, thường dùng để tạo thực thể mới hoặc chỉnh sửa thực thể hiện có
  • {
      "name": "app",
      "version": "1.0.0",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "keywords": [],
      "description": ""
    }
    
    0. Được sử dụng để yêu cầu dữ liệu từ máy chủ, thường được sử dụng để đọc dữ liệu
  • {
      "name": "app",
      "version": "1.0.0",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "keywords": [],
      "description": ""
    }
    
    1. Được sử dụng để thay thế hoàn toàn tài nguyên bằng tài nguyên đã gửi, thường được sử dụng để cập nhật dữ liệu
  • {
      "name": "app",
      "version": "1.0.0",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "keywords": [],
      "description": ""
    }
    
    2. Được sử dụng để xóa một thực thể khỏi máy chủ

Ghi chú. Lưu ý rằng bạn có thể sử dụng

$ npm init -y
9 hoặc
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
1 để chỉnh sửa dữ liệu được lưu trữ. Bạn có thể tự do lựa chọn xem mình có muốn sử dụng
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
1 hay không vì nó có thể được bỏ qua hoàn toàn. Mặc dù vậy, hãy nhất quán với các động từ HTTP bạn sử dụng. Nếu bạn đang sử dụng
$ npm init -y
9 để tạo và cập nhật, thì hoàn toàn không sử dụng phương pháp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
1

Những gì chúng ta sẽ xây dựng

Hãy tạo một ứng dụng đơn giản để lưu trữ thông tin về sách. Trong ứng dụng này, chúng tôi sẽ lưu trữ thông tin về ISBN của cuốn sách, tiêu đề, tác giả, ngày xuất bản, nhà xuất bản và số trang

Đương nhiên, chức năng cơ bản của API sẽ là chức năng CRUD. Chúng tôi muốn có thể gửi yêu cầu tới nó để tạo, đọc, cập nhật và xóa các thực thể

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
8. Tất nhiên, một API có thể làm được nhiều hơn thế - cung cấp cho người dùng điểm cuối để nhận dữ liệu thống kê, tóm tắt, gọi các API khác, v.v.

Các chức năng không phải CRUD phụ thuộc vào ứng dụng và dựa trên bản chất dự án của bạn, có thể bạn sẽ có các điểm cuối khác. Tuy nhiên, thực tế không có dự án nào có thể hoạt động mà không có CRUD

Để tránh tạo dữ liệu sách - hãy sử dụng tập dữ liệu từ GitHub để lấy một số chi tiết mẫu về sách

Thiết lập dự án

Đầu tiên, hãy khởi tạo một Node mới. dự án js

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
0

Điền thông tin được yêu cầu theo yêu cầu của bạn - bạn không cần phải điền vào tất cả các trường, nhưng chúng là một cách dễ dàng để thiết lập dữ liệu có thể nhận dạng cho một dự án. Các trường như

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
9 phù hợp hơn nhiều để xuất bản ứng dụng lên Trình quản lý gói nút, trong số các trường khác

Ngoài ra, bạn có thể sử dụng cài đặt mặc định bằng cách thêm cờ

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
20 vào cuộc gọi

$ npm init -y

Dù bằng cách nào - bạn sẽ kết thúc với một dự án có tệp

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
21. Đây là tệp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
22 chứa tất cả siêu dữ liệu có liên quan về dự án của bạn và sẽ trông giống như những dòng này theo mặc định

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}

"Mục nhập"/"chính" của ứng dụng của bạn là tệp chạy để bắt đầu dự án một cách chính xác - thường là tập lệnh chính của bạn và theo mặc định là

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
23

Ngoài ra, phiên bản ứng dụng và "tập lệnh" của bạn ở đây. Bạn có thể cung cấp bất kỳ số lượng lệnh tùy chỉnh nào trong phần

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
24, với lệnh được liên kết với bí danh. Ở đây, bí danh
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
25 là một trình bao bọc cho câu lệnh
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
26

Bạn sẽ chạy thử nghiệm ứng dụng qua

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
2

Thông thường, có một bí danh

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
27 che giấu một hoặc nhiều quy trình sẽ được chạy khi chúng tôi muốn khởi động một ứng dụng. Ở dạng cơ bản - chúng tôi chỉ chạy trang chỉ mục với nút

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
3

Bạn có thể đặt bất kỳ số lượng lệnh nào ngoài

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
28 làm tập lệnh
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
27 và khi bạn chạy
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
30 - tất cả chúng sẽ chạy

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
7

Ghi chú. Vì chúng tôi chỉ có một lệnh trong tập lệnh bắt đầu, nên về mặt chức năng, nó tương đương với việc chỉ gọi

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
31 trong dòng lệnh để khởi động ứng dụng

Bây giờ bạn đã quen thuộc với dự án, hãy cài đặt Express

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
9

Một tệp mới được tạo trong thư mục, cùng với thư mục

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
32. Tệp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
33 theo dõi các phụ thuộc của bạn và chứa các phiên bản và tên của chúng

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
2

Thư mục

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
32 thực sự lưu trữ mã của các phần phụ thuộc và có thể trở nên khá lớn rất nhanh. Chỉ bằng cách cài đặt Express, chúng tôi đã có một số lượng lớn mô-đun được cài đặt và theo dõi trong tệp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
33

Trên thực tế, các mô-đun này nhỏ nên nó không phải là vấn đề. Bằng cách sử dụng tệp

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
33, một khách hàng khác không thể biết phần phụ thuộc nào cần tải xuống và phiên bản nào sẽ sử dụng để có thể khởi động ứng dụng của bạn một cách chính xác

Ghi chú. Khi thực hiện kiểm soát phiên bản bằng các công cụ như Git - tốt nhất là không nên phiên bản mã nguồn của các mô-đun bạn sử dụng trong ứng dụng. Về mặt thực tế - không theo dõi hoặc đẩy

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
32 vào kho lưu trữ. Những người khác có thể tải xuống các phụ thuộc dựa trên
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
33 quan trọng, điều này sẽ tự động xảy ra khi họ chạy ứng dụng với
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
39

Tạo một điểm cuối đơn giản

Bây giờ, hãy bắt đầu xây dựng một ứng dụng "Xin chào thế giới" đơn giản. Nó sẽ có một điểm cuối đơn giản duy nhất chỉ trả về một thông báo dưới dạng phản hồi cho yêu cầu lấy trang chủ của chúng tôi

Trước tiên, hãy tạo một tệp có tên

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
70

$ npm init -y
0

Sau đó, hãy nhập khung Express bên trong nó

$ npm init -y
1

Tiếp theo, chúng tôi sẽ muốn khởi tạo ứng dụng Express

$ npm init -y
0

Và đặt cổng của chúng tôi

$ npm init -y
1

Cổng sẽ được sử dụng sau một chút, khi chúng tôi yêu cầu ứng dụng lắng nghe yêu cầu. Ba dòng này là bản soạn sẵn - nhưng điều tuyệt vời là, đó là tất cả những bản soạn sẵn có

Bây giờ, chúng ta có thể tạo một điểm cuối

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
0 đơn giản ngay bên dưới bản soạn sẵn. Khi người dùng truy cập điểm cuối bằng yêu cầu GET, thông báo "Xin chào thế giới, từ tốc hành" sẽ được trả về (và được hiển thị trong trình duyệt hoặc hiển thị trên bảng điều khiển)

Chúng tôi muốn đặt nó ở trên trang chủ, vì vậy URL cho điểm cuối là

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
72

$ npm init -y
2

Tại thời điểm này, hãy bắt đầu khách hàng của chúng tôi

$ npm init -y
3

Hãy chạy ứng dụng và truy cập điểm cuối duy nhất chúng tôi có thông qua trình duyệt của mình

$ npm init -y
4

Về mặt kỹ thuật, đây là một API đang hoạt động. Mặc dù vậy, điểm cuối này không thực sự làm được gì nhiều. Chúng ta hãy xem một số phần mềm trung gian phổ biến sẽ hữu ích cho công việc tiếp theo và tạo một số điểm cuối hữu ích hơn

Phần mềm trung gian nhanh

Như đã đề cập ở trên - ExpressJS là một máy chủ HTTP đơn giản và nó không đi kèm với nhiều tính năng vượt trội. Phần mềm trung gian hoạt động gần giống như phần mở rộng cho máy chủ Express và cung cấp các chức năng bổ sung ở "phần giữa" của yêu cầu. Nhiều tiện ích mở rộng của bên thứ ba như morgan để ghi nhật ký, multer để xử lý tệp tải lên, được sử dụng thường xuyên

Hiện tại, để bắt đầu, chúng ta cần cài đặt một phần mềm trung gian có tên là body-parser, phần mềm này giúp chúng ta giải mã phần thân từ một yêu cầu HTTP

$ npm init -y
5

Nó phân tích cú pháp phần thân của yêu cầu và cho phép chúng tôi phản ứng với yêu cầu đó một cách phù hợp

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

Vì chúng tôi đang gọi API từ các vị trí khác nhau bằng cách nhấn vào các điểm cuối trong trình duyệt. Chúng tôi cũng phải cài đặt phần mềm trung gian CORS

Nếu bạn chưa quen với việc chia sẻ tài nguyên trên nhiều nguồn gốc, thì bây giờ bạn có thể. Hãy cài đặt phần mềm trung gian và cấu hình nó

$ npm init -y
6

Xây dựng API REST với Node và Express

thêm sách

Bây giờ chúng ta có thể bắt đầu xây dựng ứng dụng của mình. Tạo một tệp mới có tên là

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
73

Như bạn có thể thấy, chúng ta có thể định cấu hình

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
74 bằng cách nhập nó và chuyển nó sang phương thức
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
75, cho phép nó làm phần mềm trung gian cho phiên bản Express
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
76

Chúng tôi sẽ sử dụng mảng

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
77 để lưu trữ bộ sưu tập sách của chúng tôi, mô phỏng cơ sở dữ liệu

Có một số loại nội dung yêu cầu HTTP. Ví dụ:

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
78 là loại nội dung mặc định cho các biểu mẫu, trong khi đó,
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
79 là thứ chúng tôi sẽ sử dụng khi yêu cầu tài nguyên bằng jQuery hoặc máy khách REST phụ trợ

Điều mà phần mềm trung gian

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
74 sẽ làm là lấy phần thân HTTP, giải mã thông tin và nối nó vào
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
91. Từ đó, chúng tôi có thể dễ dàng truy xuất thông tin từ biểu mẫu - trong trường hợp của chúng tôi là thông tin của một cuốn sách

Bên trong phương thức

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
92, hãy thêm sách vào mảng sách

Bây giờ, hãy tạo một biểu mẫu HTML đơn giản với các trường. ISBN, tiêu đề, tác giả, ngày xuất bản, nhà xuất bản và số trang trong một tệp mới, chẳng hạn như

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
93

Chúng tôi sẽ gửi dữ liệu tới API bằng thuộc tính

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
94 của biểu mẫu HTML này

Ở đây, của chúng tôi

thuộc tính của thẻ tương ứng với điểm cuối của chúng tôi và thông tin chúng tôi gửi bằng nút
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
95 là thông tin mà phương thức của chúng tôi phân tích cú pháp và thêm vào mảng. Lưu ý rằng tham số
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
96 là
$ npm init -y
9, giống như trong API của chúng tôi

Bạn sẽ thấy một cái gì đó như thế khi bạn mở trang

Nhấp vào "Gửi", chúng tôi được chào đón với tuyên bố

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
98 về ứng dụng của chúng tôi

$ npm init -y
7

Ghi chú. Xin lưu ý rằng vì chúng tôi đang sử dụng một mảng để lưu trữ dữ liệu nên chúng tôi sẽ mất chúng trong lần khởi động lại ứng dụng tiếp theo

Nhận tất cả sách

Bây giờ, hãy tạo một điểm cuối để lấy tất cả sách từ API

$ npm init -y
8

Khởi động lại máy chủ. Nếu máy chủ đang chạy, nhấn

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
99 để dừng nó trước. Thêm một số sách và mở
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
20 trong trình duyệt của bạn. Bạn sẽ thấy phản hồi JSON với tất cả sách mà bạn đã thêm

Bây giờ, hãy tạo một trang HTML để hiển thị những cuốn sách này theo cách thân thiện với người dùng

Khoảng thời gian này, chúng tôi sẽ tạo hai tệp -

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
21 mà chúng tôi sẽ sử dụng làm mẫu và tệp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
22 sẽ giữ logic để cập nhật/xóa sách và hiển thị chúng trên trang

Hãy bắt đầu với mẫu

Với mẫu đã hoàn thành, chúng tôi có thể triển khai logic thực tế để truy xuất tất cả sách bằng cách sử dụng JavaScript phía trình duyệt và API REST của chúng tôi

Trong đoạn script trên, chúng tôi đang gửi yêu cầu

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
0 đến điểm cuối
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
20 để truy xuất sách và sau đó tạo thẻ Bootstrap cho mỗi cuốn sách để hiển thị sách. Nếu mọi thứ hoạt động bình thường, bạn sẽ thấy nội dung như thế này trên trang của mình

Bạn có thể nhận thấy các nút Chỉnh sửa và Tạo và các phương thức tương ứng của chúng. Bây giờ, hãy để chúng trống và triển khai chúng khi chúng ta bắt đầu

Truy xuất Sách theo ISBN

Nếu chúng tôi muốn hiển thị một cuốn sách cụ thể cho người dùng, chúng tôi sẽ cần một cách để truy xuất nó từ cơ sở dữ liệu (hoặc mảng, trong trường hợp của chúng tôi). Điều này luôn được thực hiện bởi một khóa cụ thể cho thực thể đó. Trong hầu hết các trường hợp, mỗi thực thể có một

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
25 duy nhất giúp chúng tôi xác định chúng

Trong trường hợp của chúng tôi, mỗi cuốn sách có một ISBN về bản chất là duy nhất, vì vậy không cần giá trị

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
25 khác

Điều này thường được thực hiện bằng cách phân tích cú pháp tham số URL cho một

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
25 và tìm kiếm cuốn sách có
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
25 tương ứng

Ví dụ: nếu ISBN là

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
29 thì URL sẽ có dạng như sau,
$ npm init -y
00

Ở đây, chúng tôi được giới thiệu về các URL được tham số hóa. Vì ISBN phụ thuộc vào sách nên có thể có vô số điểm cuối ở đây. Bằng cách thêm dấu hai chấm (

$ npm init -y
01) vào đường dẫn, chúng ta có thể xác định một biến, được ánh xạ tới biến
$ npm init -y
02. Vì vậy, nếu người dùng truy cập
$ npm init -y
03 thì tham số
$ npm init -y
02 sẽ là
$ npm init -y
05

Bạn có thể chấp nhận nhiều tham số trong URL của mình nếu điều đó hợp lý trong trường hợp của bạn. Ví dụ:

$ npm init -y
06, sau đó bạn có thể lấy các tham số đó bằng cách sử dụng
$ npm init -y
07 và
$ npm init -y
08

Bây giờ, sử dụng điểm cuối của chúng tôi, chúng tôi có thể truy xuất một cuốn sách

Khởi động lại máy chủ, thêm một cuốn sách mới và mở

$ npm init -y
09 và ứng dụng sẽ trả về thông tin của cuốn sách

Xóa sách

Khi xóa các thực thể, chúng tôi thường xóa từng mục một để tránh mất dữ liệu lớn do vô tình. Để xóa các mục, chúng tôi sử dụng phương thức HTTP

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
2 và chỉ định sách bằng số ISBN của sách, giống như cách chúng tôi truy xuất sách

Chúng tôi đang sử dụng phương pháp

$ npm init -y
11 để chấp nhận các yêu cầu của
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
2. Chúng tôi cũng đã sử dụng phương pháp mảng
$ npm init -y
13 để lọc sách có ISBN liên quan để xóa sách khỏi mảng

Bây giờ hãy triển khai phương thức

$ npm init -y
14 trong tệp
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
22

Trong phương pháp này, chúng tôi đang gửi yêu cầu xóa khi nhấn nút và tải lại trang để hiển thị các thay đổi

chỉnh sửa sách

Rất giống với việc xóa các thực thể, việc cập nhật chúng yêu cầu chúng tôi lấy một thực thể cụ thể, dựa trên ISBN và sau đó gửi lệnh gọi HTTP

$ npm init -y
9 hoặc
{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
1 với thông tin mới

Hãy quay lại tệp

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
73 của chúng tôi

Khi gửi yêu cầu

$ npm init -y
9, nhằm vào một ISBN cụ thể, cuốn sách đầy đủ được cập nhật với thông tin mới

Vì chúng tôi đã tạo phương thức chỉnh sửa, chúng tôi có thể sử dụng phương thức

$ npm init -y
00 để thu thập thông tin về cuốn sách khi nhấp vào nút "Chỉnh sửa"

Chúng tôi cũng sẽ đặt tham số

{
  "name": "app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""
}
94 của biểu mẫu với URL của cuốn sách được nhấp để gửi yêu cầu

Để xác minh xem chức năng cập nhật có hoạt động hay không, hãy chỉnh sửa sách. Biểu mẫu phải được điền thông tin hiện có về cuốn sách. Thay đổi điều gì đó và nhấp vào "Gửi", sau đó bạn sẽ thấy thông báo "Sách đã được chỉnh sửa"

Phần kết luận

Đó là cách dễ dàng để xây dựng API REST bằng Node. js và Express. Bạn có thể truy cập tài liệu Express chính thức để tìm hiểu thêm về khung nếu bạn quan tâm

Ngoài ra, mã mà tôi đã cung cấp chỉ nhằm mục đích hướng dẫn, bạn không bao giờ nên sử dụng nó trong môi trường sản xuất. Đảm bảo bạn xác thực dữ liệu và tuân theo các phương pháp hay nhất khi viết mã cho sản xuất

API REST được sử dụng để làm gì?

RESTful API là giao diện mà hai hệ thống máy tính sử dụng để trao đổi thông tin một cách an toàn qua internet . Hầu hết các ứng dụng kinh doanh phải giao tiếp với các ứng dụng nội bộ và bên thứ ba khác để thực hiện các tác vụ khác nhau.

Tại sao nên sử dụng Node JS cho API REST?

js là nhẹ, nhanh và có thể mở rộng . Nút. js cho phép bạn xây dựng Proxy API nhanh, có thể mở rộng, có khả năng xử lý một số lượng lớn yêu cầu đồng thời với thông lượng cao.

Ví dụ về API REST là gì?

Ví dụ: API REST sẽ sử dụng yêu cầu GET để truy xuất bản ghi, yêu cầu POST để tạo một bản ghi, yêu cầu PUT để cập nhật bản ghi và yêu cầu XÓA để . Tất cả các phương thức HTTP có thể được sử dụng trong lệnh gọi API. API REST được thiết kế tốt tương tự như một trang web chạy trong trình duyệt web có chức năng HTTP tích hợp. . All HTTP methods can be used in API calls. A well-designed REST API is similar to a website running in a web browser with built-in HTTP functionality.

Làm cách nào để tạo API REST trong nodejs?

Hãy làm theo các bước dưới đây để xây dựng API REST Node js an toàn. .
Bước 1. Tạo các thư mục cần thiết
Bước 2. Tạo API Express ứng dụng đầu tiên của bạn
Bước 3. Tạo mô-đun người dùng
Bước 4. Tạo mô-đun xác thực