Cách chính xác để truyền nhiều giá trị cho cùng một tên tham số trong yêu cầu GET


192

Tôi đang xem xét cách chính xác để truyền nhiều giá trị cho cùng một tên tham số trong yêu cầu GET.

Tôi đã thấy các URL như thế này:

http://server/action?id=a&id=b

Và tôi đã thấy các URL như thế này:

http://server/action?id=a,b

Hiểu biết của tôi là đầu tiên là chính xác, nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo cho điều này. Tôi đã xem thông số kỹ thuật http nhưng không thể thấy bất cứ điều gì về cách phần 'truy vấn' của URL được tạo thành.

Tôi không muốn có câu trả lời là "hoặc là ổn" - nếu tôi đang xây dựng một dịch vụ web, tôi muốn biết phương thức nào là tiêu chuẩn để mọi người sử dụng dịch vụ web của tôi biết cách truyền nhiều tham số cho cùng một tên.

Vì vậy, ai đó có thể chỉ cho tôi một nguồn tham khảo chính thức để xác nhận tùy chọn nào là đúng không?

Câu trả lời:


164

Thật vậy, không có tiêu chuẩn xác định. Để hỗ trợ thông tin đó, hãy xem wikipedia, trong chương Chuỗi truy vấn . Có nhận xét sau:

Mặc dù không có tiêu chuẩn dứt khoát, hầu hết các khung web cho phép nhiều giá trị được liên kết với một trường duy nhất. [3] [4]

Hơn nữa, khi bạn xem RFC 3986 , trong phần 3.4 Truy vấn , không có định nghĩa cho các tham số có nhiều giá trị.

Hầu hết các ứng dụng sử dụng tùy chọn đầu tiên bạn đã hiển thị : http://server/action?id=a&id=b. Để hỗ trợ thông tin đó, hãy xem liên kết Stackoverflow này và liên kết MSDN này liên quan đến các ứng dụng ASP.NET, sử dụng cùng một tiêu chuẩn cho các tham số có nhiều giá trị.

Tuy nhiên, vì bạn đang phát triển API, tôi khuyên bạn nên làm những gì dễ nhất cho bạn, vì người gọi API sẽ không gặp nhiều khó khăn khi tạo chuỗi truy vấn.


Trong trường hợp không có bất kỳ thông tin nào ngược lại, tôi đoán bạn đúng - nếu RFC3986 không chỉ định một tiêu chuẩn thì sẽ không có thông tin nào. Cảm ơn Eduardo.
thoát y

18
A sẽ đề nghị sử dụng id=a&id=bnhư boolean AND và id=a,bnhư boolean OR.
Alex Skrypnyk

16
FWIW PHP không hỗ trợ đọc các đối số như thế nào ?id=5&id=3. PHP sẽ chỉ đọc trong một giá trị cho id ở đây. Nếu tôi nhớ chính xác, nó sẽ phải trông như thế này để nó hoạt động với PHP:?id[]=5&id[]=3
Bạn đã thử cái gì vào

3
+1 chosince you are developing the APIs, I suggest you to do what is the easiest for you, since the caller of the API will not have much trouble creating the query string.
Amr

2
id=a,blàm cho giả định rằng hôn mê ,là một dấu phân cách hợp lệ. Nhưng các giá trị tham số của bạn có thể chứa a ,. Sau đó, khách hàng cần thoát ,trong các giá trị tham số truy vấn. Nhưng bạn có thể quyết định ;là tốt hơn. Điều đó có nghĩa là máy khách và máy chủ sẽ chia sẻ dấu phân cách chính thức cho API của bạn. id=a&id=bkhông có vấn đề này mặc dù nó làm cho url lâu hơn
Ronan Quillevere

5

Tôi sẽ đề nghị xem xét cách các trình duyệt xử lý các biểu mẫu theo mặc định. Ví dụ, hãy xem phần tử biểu mẫu <select multiple>và cách nó xử lý nhiều giá trị từ ví dụ này tại w3schools.

<form action="/action_page.php">
<select name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>
<input type="submit">
</form>

Để sử dụng PHP:

<select name="cars[]" multiple>

Ví dụ trực tiếp từ trên tại w3schools.com

Từ trên nếu bạn nhấp vào "saab, opel" và nhấp vào gửi, nó sẽ tạo ra kết quả của ô tô = saab & ô tô = opel . Sau đó, tùy thuộc vào máy chủ back-end, những chiếc xe tham số sẽ đi qua như một mảng mà bạn có thể xử lý thêm.

Hy vọng điều này sẽ giúp bất cứ ai tìm kiếm một cách 'tiêu chuẩn' hơn để xử lý vấn đề này.

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.