Cách lọc dữ liệu API trong JavaScript

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 100

Chú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 để

    SELECT
        *
    FROM
        Items
    ORDER BY Id
    LIMIT 20
    OFFSET 40;
    
    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ố URL

  • 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

    SELECT
        *
    FROM
        Items
    ORDER BY Id
    LIMIT 20
    OFFSET 40;
    
    2 [tên chỗ nghỉ, nhà điều hành]

  • 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 100

Nhữ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ụ:
    SELECT
        *
    FROM
        Items
    ORDER BY Id
    LIMIT 20
    OFFSET 40;
    
    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?

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;
6

Cá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ứ 100

Thí dụ

[Giả sử truy vấn được sắp xếp theo ngày tạo giảm dần]

  1. Khách hàng đưa ra yêu cầu cho các mặt hàng gần đây nhất.
    SELECT
        *
    FROM
        Items
    ORDER BY Id
    LIMIT 20
    OFFSET 40;
    
    8
  2. Khi cuộn/trang tiếp theo, khách hàng đưa ra yêu cầu thứ hai
    SELECT
        *
    FROM
        Items
    ORDER BY Id
    LIMIT 20
    OFFSET 40;
    
    9
  3. Khi cuộn/trang tiếp theo, khách hàng đưa ra yêu cầu thứ ba
    SELECT
        *
    FROM
        Items
    WHERE
      created  20
    LIMIT 20
    
    6

  4. SELECT
        *
    FROM
        Items
    WHERE
      Id > 20
    LIMIT 20
    
    7 và
    SELECT
        *
    FROM
        Items
    WHERE
      Id > 20
    LIMIT 20
    
    8

  5. SELECT
        *
    FROM
        Items
    WHERE
      Id > 20
    LIMIT 20
    
    9 và
    SELECT
        email AS AFTER_EMAIL
    FROM
        Items
    WHERE
      Id = 20
    
    0

  6. 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ặc

    SELECT
        email AS AFTER_EMAIL
    FROM
        Items
    WHERE
      Id = 20
    
    2

    Nế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

    • San Francisco
    • E-mail
    • Twitter
    • LinkedIn
    • GitHub

    Những bài viết liên quan

    Phát triển API

    Xây dựng API RESTful với Java Spring Boot

    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

    Xây dựng API RESTful với Go

    Bạn đang tìm cách xây dựng một API REST đơn giản với Go và Gin?

    Làm cách nào để tìm kiếm dữ liệu từ API trong JavaScript?

    Tiếp cận. Trước tiên hãy tạo tệp JavaScript, tệp HTML và tệp CSS cần thiết. Sau đó lưu trữ URL API trong một biến [ở đây api_url]. Xác định hàm async [ở đây getapi[]] và chuyển api_url vào hàm đó. Xác định một phản hồi liên tục và lưu trữ dữ liệu đã tìm nạp bằng phương thức chờ tìm nạp []

    Làm cách nào để lọc dữ liệu trong API REST?

    Cú pháp của một tham số bộ lọc là {element}__{operator}={value}, trong đó {element} là ID của một mục trong biểu mẫu hoặc một . Ví dụ: tên_tác giả được sử dụng để lọc theo tên của người gửi bản ghi đầu tiên. . For example, the author_name is used to filter by the name of the initial submitter of a record.

    Làm cách nào để lọc các phần tử trong JavaScript?

    Người ta có thể sử dụng hàm filter[] trong JavaScript để lọc mảng đối tượng dựa trên các thuộc tính. Hàm filter[] sẽ trả về một mảng mới chứa tất cả các phần tử của mảng thỏa mãn điều kiện đã cho. Nếu không có phần tử nào vượt qua điều kiện, nó sẽ trả về một mảng trống.

    Làm cách nào để lọc mảng theo chỉ mục JavaScript?

    Đây là cú pháp của Array Filter. const returnValue = mảng. bộ lọc[[giá trị, chỉ mục, mảng] => {. }, thisArg]; ReturnValue của chúng tôi sẽ chứa mảng giá trị trả về được lọc mới của chúng tôi.

Chủ Đề