Sự khác biệt giữa tham số URL và chuỗi truy vấn là gì?


91

Tôi không thấy có nhiều sự khác biệt giữa các tham số và chuỗi truy vấn, trong URL. Vì vậy, sự khác biệt là gì và khi nào nên sử dụng cái này hơn cái kia?


1
Bạn có ngữ cảnh không, vì theo như tôi biết thì cả hai thường được sử dụng cho cùng một ngữ cảnh - nhưng trường hợp của bạn có thể là ngữ cảnh cụ thể.
Allan S. Hansen

Tôi không có bối cảnh cụ thể, là một câu hỏi chung chung. Trong trường hợp nào tôi nên sử dụng cách này thay vì cách khác. Phải có cách sử dụng khác nhau của hai cái đó.
Konst

Cá nhân - Tôi chủ yếu sử dụng tham số từ khi nói về chúng trong ngữ cảnh cuộc gọi biến hoặc phương thức và chuỗi truy vấn khi nói về chúng trong ngữ cảnh URL. (ví dụ: chuỗi truy vấn được chia thành các tham số cho phương thức). Nhưng nó chỉ là ngôn ngữ nên ngữ cảnh và tình huống khác nhau và tôi nghi ngờ có ai đó sẽ săn lùng bạn để sử dụng một trong hai khi bạn "cảm thấy" thích nó :).
Allan S. Hansen

Câu trả lời:


84

Thành phần truy vấn được chỉ định bởi thành phần đầu tiên ?trong URI. "Chuỗi truy vấn" có thể là một từ đồng nghĩa (thuật ngữ này không được sử dụng trong tiêu chuẩn URI).

Một số ví dụ cho URI HTTP với các thành phần truy vấn:

http://example.com/foo?bar
http://example.com/foo/foo/foo?bar/bar/bar
http://example.com/?bar
http://example.com/?@bar._=???/1:
http://example.com/?bar1=a&bar2=b

( danh sách các ký tự được phép trong thành phần truy vấn )

"Định dạng" của thành phần truy vấn tùy thuộc vào tác giả của URI. Một quy ước chung ( nhưng không có gì khác hơn một quy ước, theo như tiêu chuẩn URI có liên quan ¹) là sử dụng thành phần truy vấn cho các cặp khóa-giá trị, hay còn gọi là. thông số , như trong ví dụ cuối cùng trên: bar1=a&bar2=b.

Các tham số như vậy cũng có thể xuất hiện trong các thành phần URI khác, tức là đường dẫn² và phân mảnh. Về tiêu chuẩn URI, việc sử dụng thành phần nào và định dạng nào là tùy thuộc vào bạn.

Ví dụ về URI với các tham số trong đường dẫn, truy vấn và phân đoạn:

http://example.com/foo;key1=value1?key2=value2#key3=value3

¹ Tiêu chuẩn URI nói về thành phần truy vấn :

[…] Các thành phần truy vấn thường được sử dụng để mang thông tin nhận dạng dưới dạng cặp "key = value" […]

² Tiêu chuẩn URI nói về thành phần đường dẫn :

[…] Các ký tự dành riêng cho dấu chấm phẩy (";") và bằng ("=") thường được sử dụng để phân tách các tham số và giá trị tham số áp dụng cho phân đoạn đó. Ký tự dành riêng dấu phẩy (",") thường được sử dụng cho các mục đích tương tự.


1
Tham số và truy vấn khác nhau. Xem phần 3.3 và 3.4 trong tools.ietf.org/html/rfc2396.html
cowlinator

@cowlinator: (RFC 2396 đã lỗi thời, nhưng tiêu chuẩn hiện tại, RFC 3986, nói điều gì đó tương tự về các tham số trong thành phần đường dẫn ). Tôi đã không nói rằng chúng giống nhau, hay tôi đã làm? Các tác giả URI có thể chỉ định các tham số trong thành phần truy vấn (như được mô tả trong câu trả lời của tôi) và họ cũng có thể chỉ định các tham số trong thành phần đường dẫn (như được mô tả trong tài liệu tham khảo của bạn) - trong cả hai trường hợp, đó chỉ là một quy ước, không có gì mà tiêu chuẩn xác định. - Bạn có đề nghị thay đổi câu trả lời của tôi không? Bạn có nghĩ rằng OP có nghĩa là các tham số trong đường dẫn?
unor

30

Tham số là các cặp khóa-giá trị có thể xuất hiện bên trong đường dẫn URL và bắt đầu bằng ký tự dấu chấm phẩy ( ;).

Chuỗi truy vấn xuất hiện sau đường dẫn (nếu có) và bắt đầu bằng ký tự dấu chấm hỏi ( ?).

Cả hai tham số và chuỗi truy vấn đều chứa các cặp khóa-giá trị.

Trong một GETyêu cầu, các thông số xuất hiện trong chính URL:

<scheme>://<username>:<password>@<host>:<port>/<path>;<parameters>?<query>#<fragment>

Trong một POSTyêu cầu, các tham số có thể xuất hiện trong chính URL, nhưng cũng có thể xuất hiện trong dòng dữ liệu (được gọi là nội dung).

Chuỗi truy vấn luôn là một phần của URL.

Các tham số có thể được chôn trong dòng form-datadữ liệu khi sử dụng phương thức POST để chúng có thể không xuất hiện trong URL. Có, một POSTyêu cầu có thể xác định các tham số dưới dạng dữ liệu biểu mẫu trong URL, và điều này không nhất quán vì các tham số có thể có nhiều giá trị.

Tôi không tìm thấy lời giải thích nào cho hành vi này cho đến nay. Tôi đoán đôi khi có thể hữu ích khi "bỏ ẩn" các tham số khỏi một POSTyêu cầu hoặc thậm chí để mã xử lý GETyêu cầu chia sẻ một số phần với xử lý mã a POST. Tất nhiên điều này chỉ có thể hoạt động với các tham số hỗ trợ mã máy chủ trong một URL.

Cho đến khi bạn có được thông tin chi tiết tốt hơn, tôi khuyên bạn chỉ nên sử dụng các tham số trong dòng form-datadữ liệu POSTyêu cầu.

Nguồn:

Điều mà mọi nhà phát triển nên biết về URL

RFC 3986

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.