Vâng, bạn có một số vấn đề ở đây. Nhưng điều đầu tiên là nơi bạn sử dụng includes[]
không phải trên một chuỗi… giải đấu. cạnh tranh là một đối tượng. Vì vậy, bạn cần sử dụng res.name.includes[id]
. Tiếp theo, id đang trả về tên quốc gia trong thuộc tính data-id
của một nút. Đối với nước Anh, đây là ‘England’. Tuyệt vời, nhưng các trận đấu có tên ENGLAND. Vì vậy, bạn phải viết hoa ID của mình nếu bạn muốn khớp nó với tên
Bây giờ sau này, bạn gặp một số vấn đề về thiết kế khi bạn lặp qua các nút của mình và thêm các sự kiện nhấp chuột. Tốt thôi, nhưng sau đó bạn chuyển sang phần hiển thị kết quả. Mà được thực hiện một lần. Khi bạn nhấp vào một nút, trình xử lý sự kiện được kích hoạt, nhưng không phải mã hiển thị đó. Tôi khuyên bạn nên đặt mã hiển thị của mình vào một chức năng mà bạn có thể gọi. Truyền cho nó kết quả từ dữ liệu đã lọc của bạn
Tôi đã tập hợp một số bản sửa lỗi và ý tưởng cho bạn thấy cách thức hoạt động của nó. Tôi đã bao gồm một số ý kiến
Thiết kế API đang trở thành trụ cột cốt lõi của chiến lược sản phẩm API bất kể API được công khai hay được sử dụng nội bộ. Thiết kế API tốt giúp cải thiện Trải nghiệm tổng thể của nhà phát triển [DX] cho bất kỳ chương trình API nào và có thể cải thiện hiệu suất cũng như khả năng bảo trì lâu dài
Tuy nhiên, không có hướng dẫn thiết kế API tiêu chuẩn hoặc chính thức. RESTful chỉ là một kiểu kiến trúc. Có sẵn rất nhiều hướng dẫn api dành cho người mới bắt đầu về thiết kế API, chẳng hạn như hướng dẫn này và hướng dẫn này. Tuy nhiên, chúng tôi không tìm thấy nhiều hướng dẫn api về lọc và phân trang nâng cao hơn, điều này đã thôi thúc chúng tôi xuất bản bài đăng này
lọc
Tham số URL là cách dễ nhất để thêm tính năng lọc cơ bản vào API REST. Nếu bạn có một điểm cuối /items
là các mặt hàng để bán, bạn có thể lọc qua tên thuộc tính, chẳng hạn như _______ 44 _______ hoặc _______ 45 _______. Tuy nhiên, điều này chỉ hoạt động cho các trận đấu chính xác. Nếu bạn muốn thực hiện một phạm vi chẳng hạn như phạm vi giá hoặc ngày thì sao?
Vấn đề là các tham số URL chỉ có một khóa và một giá trị nhưng các bộ lọc bao gồm ba thành phần
- Thuộc tính hoặc tên trường
- Toán tử như eq, lte, gte
- Giá trị bộ lọc
Có nhiều cách khác nhau để mã hóa ba thành phần thành khóa/giá trị tham số URL
Chân đế LHS
Một cách để mã hóa toán tử là sử dụng dấu ngoặc vuông
SELECT
*
FROM
Items
ORDER BY Id
LIMIT 20
OFFSET 40;
0 trên tên khóa. Ví dụ: SELECT
*
FROM
Items
ORDER BY Id
LIMIT 20
OFFSET 40;
1 sẽ tìm tất cả các mặt hàng có giá lớn hơn hoặc bằng 10 nhưng nhỏ hơn hoặc bằng 100Chúng ta có thể có bao nhiêu toán tử tùy thích, chẳng hạn như [lte], [gte], [exists], [regex], [before] và [after]
Chân đế LHS khó phân tích cú pháp hơn một chút ở phía máy chủ, nhưng cung cấp tính linh hoạt cao hơn về giá trị bộ lọc dành cho máy khách. Không cần xử lý các ký tự đặc biệt khác nhau
Những lợi ích
Dễ dàng sử dụng cho khách hàng. Có rất nhiều thư viện phân tích cú pháp chuỗi truy vấn có sẵn dễ dàng mã hóa các đối tượng JSON lồng nhau thành các dấu ngoặc vuông. qs là một trong những thư viện tự động mã hóa/giải mã dấu ngoặc vuông
var qs = require['qs']; var assert = require['assert']; assert.deepEqual[qs.parse['price[gte]=10&price[lte]=100'], { price: { gte: 10, lte: 100 } }];
Đơn giản để phân tích cú pháp ở phía máy chủ. Khóa tham số URL chứa cả tên trường và toán tử. Dễ dàng để
2 [tên thuộc tính, toán tử] mà không cần nhìn vào các giá trị tham số URLSELECT * FROM Items ORDER BY Id LIMIT 20 OFFSET 40;
Không cần thoát các ký tự đặc biệt trong giá trị bộ lọc khi toán tử được lấy làm thuật ngữ bộ lọc theo nghĩa đen. Điều này đặc biệt đúng khi bộ lọc của bạn bao gồm các trường siêu dữ liệu tùy chỉnh bổ sung mà người dùng của bạn có thể đặt
Nhược điểm
Có thể yêu cầu nhiều công việc hơn ở phía máy chủ để phân tích cú pháp và nhóm các bộ lọc. Bạn có thể phải viết trình phân tích cú pháp hoặc trình kết nối tham số URL tùy chỉnh để chia khóa chuỗi truy vấn thành hai thành phần. Tên trường và toán tử. Sau đó, bạn sẽ cần phải
2 [tên chỗ nghỉ, nhà điều hành]SELECT * FROM Items ORDER BY Id LIMIT 20 OFFSET 40;
Các ký tự đặc biệt trong tên biến có thể gây khó xử. Bạn có thể phải viết một trình kết dính tùy chỉnh để chia khóa chuỗi truy vấn thành hai thành phần. Tên trường và toán tử
Khó quản lý các bộ lọc tổ hợp tùy chỉnh. Nhiều bộ lọc có cùng tên thuộc tính và toán tử dẫn đến AND ẩn. Điều gì sẽ xảy ra nếu người dùng API muốn HOẶC các bộ lọc thay thế. tôi. e. tìm tất cả các mặt hàng có giá nhỏ hơn 10 HOẶC lớn hơn 100?
Đại tràng RHS
Tương tự như cách tiếp cận khung, bạn có thể thiết kế API để đưa toán tử vào RHS thay vì LHS. Ví dụ:
SELECT
*
FROM
Items
ORDER BY Id
LIMIT 20
OFFSET 40;
4 sẽ tìm tất cả các mặt hàng có giá lớn hơn hoặc bằng 10 nhưng nhỏ hơn hoặc bằng 100Những lợi ích
- Dễ dàng phân tích cú pháp nhất ở phía máy chủ, đặc biệt nếu các bộ lọc trùng lặp không được hỗ trợ. Không cần chất kết dính tùy chỉnh. Nhiều khung API đã xử lý các mảng tham số URL. Nhiều bộ lọc giá sẽ có cùng một biến 'giá', có thể là một Trình tự hoặc Bản đồ
Nhược điểm
- Giá trị chữ cần xử lý đặc biệt. Ví dụ:
5 sẽ dịch để tìm tất cả các mục có user_id lớn hơn 100. Tuy nhiên, nếu chúng ta muốn tìm tất cả các mục có user_id bằng gt thì sao?. 100 vì đó có thể là id hợp lệ không?SELECT * FROM Items ORDER BY Id LIMIT 20 OFFSET 40;
Tham số truy vấn tìm kiếm
Nếu bạn yêu cầu tìm kiếm trên điểm cuối của mình, bạn có thể thêm hỗ trợ cho các bộ lọc và phạm vi trực tiếp bằng tham số tìm kiếm. Nếu bạn đã sử dụng Tìm kiếm đàn hồi hoặc công nghệ dựa trên Lucene khác, bạn có thể hỗ trợ trực tiếp cú pháp Lucene hoặc Chuỗi truy vấn đơn giản của Tìm kiếm đàn hồi
Ví dụ: chúng tôi có thể tìm kiếm các mặt hàng có chứa cụm từ ghế đỏ và giá lớn hơn hoặc bằng 10 và nhỏ hơn hoặc bằng 100.
SELECT
*
FROM
Items
ORDER BY Id
LIMIT 20
OFFSET 40;
6Các API như vậy có thể cho phép đối sánh độ mờ, tăng một số thuật ngữ nhất định, v.v.
Những lợi ích
Hầu hết các truy vấn linh hoạt cho người dùng API
Hầu như không cần phân tích cú pháp trên chương trình phụ trợ, có thể chuyển trực tiếp đến công cụ tìm kiếm hoặc cơ sở dữ liệu [Chỉ cần cẩn thận vệ sinh đầu vào để bảo mật]
Nhược điểm
Người mới bắt đầu làm việc với API khó hơn. Cần làm quen với cú pháp Lucene
Tìm kiếm toàn văn không có ý nghĩa đối với tất cả các tài nguyên. Ví dụ: Độ mờ và tăng thuật ngữ không có ý nghĩa đối với dữ liệu chỉ số chuỗi thời gian
Yêu cầu mã hóa phần trăm URL khiến việc sử dụng cURL hoặc Postman trở nên phức tạp hơn
Moesif là gì? . Moesif có SDK và plugin cho các cổng API phổ biến như Kong, v.v.
phân trang
Hầu hết các điểm cuối trả về danh sách các thực thể sẽ cần phải có một số loại phân trang
Nếu không phân trang, một tìm kiếm đơn giản có thể trả về hàng triệu hoặc thậm chí hàng tỷ lượt truy cập gây ra lưu lượng truy cập mạng không liên quan
Phân trang yêu cầu một thứ tự ngụ ý. Theo mặc định, đây có thể là mã định danh duy nhất của mục, nhưng có thể là các trường được sắp xếp khác, chẳng hạn như ngày tạo
Phân trang bù đắp
Đây là hình thức phân trang đơn giản nhất. Giới hạn/Bù đắp trở nên phổ biến với các ứng dụng sử dụng cơ sở dữ liệu SQL đã có LIMIT và OFFSET như một phần của Cú pháp CHỌN SQL. Rất ít logic kinh doanh được yêu cầu để triển khai phân trang Giới hạn/Bù đắp
Phân trang giới hạn/bù sẽ trông giống như
SELECT
*
FROM
Items
ORDER BY Id
LIMIT 20
OFFSET 40;
7. Truy vấn này sẽ trả về 20 hàng bắt đầu từ hàng thứ 100Thí dụ
[Giả sử truy vấn được sắp xếp theo ngày tạo giảm dần]
- Khách hàng đưa ra yêu cầu cho các mặt hàng gần đây nhất.
8SELECT * FROM Items ORDER BY Id LIMIT 20 OFFSET 40;
- Khi cuộn/trang tiếp theo, khách hàng đưa ra yêu cầu thứ hai
9SELECT * FROM Items ORDER BY Id LIMIT 20 OFFSET 40;
- Khi cuộn/trang tiếp theo, khách hàng đưa ra yêu cầu thứ ba
6SELECT * FROM Items WHERE created 20 LIMIT 20
7 vàSELECT * FROM Items WHERE Id > 20 LIMIT 20
8SELECT * FROM Items WHERE Id > 20 LIMIT 20
9 vàSELECT * FROM Items WHERE Id > 20 LIMIT 20
0SELECT email AS AFTER_EMAIL FROM Items WHERE Id = 20
- San Francisco
- GitHub
Sắp xếp nhiều cột
Không nên sử dụng thiết kế cuối cùng khi sắp xếp và thứ tự không được ghép nối. Cuối cùng, bạn có thể cho phép sắp xếp theo hai hoặc nhiều cột
SELECT
email
FROM
Items
ORDER BY Last_Modified DESC, Email ASC
LIMIT 20
Để mã hóa cách sắp xếp nhiều cột này, bạn có thể cho phép nhiều tên trường chẳng hạn như
SELECT
email AS AFTER_EMAIL
FROM
Items
WHERE
Id = 20
1 hoặcSELECT
email AS AFTER_EMAIL
FROM
Items
WHERE
Id = 20
2Nếu trường sắp xếp và thứ tự không được ghép nối, thứ tự tham số URL cần được giữ nguyên; . Tuy nhiên, nhiều khung phía máy chủ có thể không duy trì thứ tự sau khi được giải tuần tự hóa thành bản đồ
Bạn cũng phải đảm bảo thứ tự tham số URL được xem xét cho bất kỳ khóa bộ đệm nào, nhưng điều này sẽ gây áp lực lên kích thước bộ đệm
Phần kết luận
Thiết kế API tốt là một thành phần quan trọng đối với Trải nghiệm dành cho nhà phát triển [DX] của bạn. Thông số kỹ thuật API có thể tồn tại lâu hơn nhiều triển khai máy chủ cơ bản, đòi hỏi phải suy nghĩ về các trường hợp sử dụng trong tương lai cho API của bạn
Giám sát API REST với Moesif
Tìm hiểu thêm, , ,
Derric Mang
Đồng sáng lập & Giám đốc điều hành @Moesif. Kiến trúc sư máy tính trước đây @Intel. Đã học @UMichigan
Làm theo
Phát triển API Tìm hiểu cách dễ dàng tạo API REST bằng sức mạnh của Spring Boot. Chỉ với vài bước đơn giản, bạn có thể nhanh chóng thiết lập và chạy một API đầy đủ chức năng Ngày 11 tháng 1 năm 2023 Phát triển API Bạn đang tìm cách xây dựng một API REST đơn giản với Go và Gin? Những bài viết liên quan
Xây dựng API RESTful với Java Spring Boot
Xây dựng API RESTful với Go
Làm cách nào để tìm kiếm dữ liệu từ API trong JavaScript?
Làm cách nào để lọc dữ liệu trong API REST?
Làm cách nào để lọc các phần tử trong JavaScript?
Làm cách nào để lọc mảng theo chỉ mục JavaScript?