aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

URLSearchParams hay encodeURIComponent: chọn cách tạo query string có tiếng Việt

Suong Nguyen by Suong Nguyen
27/10/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Ô tìm kiếm nhận cà phê & trà+đá. Nếu nối thẳng chuỗi này sau ?q=, dấu & có thể trở thành ranh giới giữa hai tham số. Lỗi thường lộ ra với dữ liệu thật, dù từ khóa hello chạy bình thường.

URLSearchParams và encodeURIComponent() đều có thể tham gia giải quyết việc mã hóa dữ liệu trong query. Chúng có phạm vi khác nhau: một bên quản lý tập cặp khóa–giá trị, bên còn lại mã hóa một thành phần chuỗi. Bài so sánh theo cùng tiêu chí và dùng ví dụ tự tạo, đối chiếu MDN ngày 27/10/2026; không có đo thời gian hay bộ nhớ.

1. Cách bắt đầu và mức kiểm soát

Ví dụ dưới chạy bằng Node.js 24.18.1, không cài dependency và không gửi request mạng. example.com chỉ là địa chỉ minh họa.

const term = 'cà phê & trà+đá';
const manual = new URL(
  'https://example.com/search?q=' + encodeURIComponent(term)
);
const managed = new URL('https://example.com/search');
managed.searchParams.set('q', term);

console.log(manual.searchParams.get('q') === term);
console.log(managed.searchParams.get('q') === term);
console.log(manual.search);
console.log(managed.search);

Hai dòng boolean đều là true. Query của cách thứ nhất dùng %20 cho khoảng trắng; cách thứ hai dùng +. Dấu cộng thuộc dữ liệu được mã hóa thành %2B, nên vẫn đọc lại đúng. Hai chuỗi query có thể khác byte mà cùng khôi phục một giá trị theo cách parse này.

Với đúng một tham số, mã hóa giá trị rồi nối chuỗi vẫn dễ kiểm tra. Khi số tham số tăng, người viết phải tự quản lý dấu ?, dấu &, khóa và tình huống tham số đã tồn tại. URL.searchParams đặt phần việc đó vào API có cấu trúc.

2. Tham số lặp và thay đổi giá trị

const filter = new URL('https://example.com/search?page=1');
filter.searchParams.append('tag', 'flutter');
filter.searchParams.append('tag', 'react native');
console.log(filter.searchParams.getAll('tag'));

filter.searchParams.set('page', '2');
console.log(filter.searchParams.get('page'));
console.log(filter.searchParams.getAll('tag').length);

Kết quả là hai tag theo thứ tự thêm, page bằng '2' và số tag bằng 2. append diễn đạt việc thêm một giá trị; set diễn đạt thay thế giá trị của khóa. Dùng getAll khi server chấp nhận nhiều giá trị cho cùng khóa, thay vì chỉ nhìn get rồi kết luận tag bị mất.

encodeURIComponent không quản lý khái niệm khóa lặp. Bạn vẫn có thể tự dựng đúng, nhưng phải giữ logic danh sách, phân tách và cập nhật ở code gọi. Đây là chi phí bảo trì, không phải hạn chế về khả năng biểu diễn dữ liệu.

3. So sánh để chọn trong dự án

Tiêu chí URLSearchParams encodeURIComponent và ghép chuỗi
Bắt đầu với một giá trị Có thêm đối tượng query hoặc URL Ngắn nếu template cố định
Kiểm soát khóa lặp Có append, set, getAll Tự quản lý cấu trúc
Tích hợp URL có sẵn URL.searchParams cập nhật query Cần tự giữ các phần URL
Hệ sinh thái API Web có sẵn ở runtime hiện đại Hàm JavaScript tích hợp
Hiệu năng Bài chưa đo Bài chưa đo
Chi phí vận hành Không cần dịch vụ ngoài trong ví dụ Không cần dịch vụ ngoài trong ví dụ

Với bộ lọc tìm kiếm có nhiều lựa chọn, tôi chọn URL cùng searchParams vì thao tác thêm, xóa và thay thế dễ đọc. Nếu một thư viện yêu cầu bạn cung cấp riêng một thành phần đã mã hóa, encodeURIComponent có thể đúng tầng trách nhiệm hơn. Hãy đọc hợp đồng của thư viện trước khi truyền vào.

4. Ba lỗi cần đưa vào kiểm tra

Đầu tiên là mã hóa hai lần. Truyền encodeURIComponent(term) vào searchParams.set khiến dấu % của chuỗi trung gian lại bị mã hóa. Giá trị đọc lại là chuỗi đã encode, không còn bằng term. Với API khóa–giá trị, hãy truyền giá trị gốc.

Thứ hai, new URLSearchParams(fullUrl) không phải cách parse một URL đầy đủ. Hãy dùng new URL(fullUrl).searchParams. Thứ ba, nếu truyền query dạng chuỗi chứa dấu cộng chưa encode, parser có thể hiểu nó thành khoảng trắng. Dùng append hoặc set cho dữ liệu gốc thay vì nội suy dữ liệu vào cú pháp query.

Thêm fixture cho chuỗi rỗng, dấu &, dấu cộng, #, tiếng Việt và khóa lặp. Với một API đặc biệt hoặc URL có chữ ký, kiểm tra quy tắc chuẩn hóa của bên nhận; không tự thay %20 bằng + rồi giả định chữ ký vẫn hợp lệ.

Phạm vi bằng chứng

Các snippet và các trường hợp encode hai lần đã được chạy trên Node.js trong lượt biên tập. Chúng kiểm tra việc dựng và đọc lại URL cục bộ, chưa kiểm tra server đích hay engine JavaScript trên thiết bị mobile. Mã hóa query cũng không thay thế kiểm tra quyền truy cập hoặc validation nghiệp vụ ở backend.

Chọn theo lớp dữ liệu bạn đang thao tác và giữ các ca ký tự đặc biệt trong kiểm tra. Không cần một thư viện mạng để chứng minh query còn giữ đúng từ khóa của người dùng.

Nguồn tham khảo

  • MDN: URLSearchParams
  • MDN: encodeURIComponent
  • MDN: URL constructor

Tags: Đánh giá công cụJavaScriptURL
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.includes hay Set.has: chọn theo cách dữ liệu được tra cứu và cập nhật

by Suong Nguyen
26/10/2026
0

So sánh Array.includes và Set.has bằng hành vi, vòng đời cập nhật và chi phí tạo cấu trúc, không dựa vào một benchmark thiếu ngữ cảnh.

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

gzip hay Brotli cho asset text: đo kích thước trước khi chọn cấu hình

by Suong Nguyen
25/10/2026
0

So sánh gzip và Brotli bằng fixture tự tạo, kiểm tra giải nén đúng dữ liệu và đánh giá cả chi phí build lẫn cách phục vụ asset.

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

npm ci và npm install: chọn theo cách quản lý lockfile của nhóm

by Suong Nguyen
24/10/2026
0

So sánh npm ci và npm install bằng hành vi với lockfile, ví dụ offline và tiêu chí vận hành có thể kiểm tra.

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

Node test runner hay Vitest: chọn theo cách dự án chạy code

by Suong Nguyen
23/10/2026
0

So sánh test runner tích hợp Node.js và Vitest theo module, TypeScript, mock và chi phí vận hành thay vì suy đoán tốc độ.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native SectionList: nhóm dữ liệu với key và tiêu đề riêng cho từng phần
  • Phỏng vấn JavaScript: Object.is khác === thế nào với NaN, +0 và -0?
  • Android Sharesheet: chia sẻ văn bản và đường dẫn bằng ACTION_SEND

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply