2009-11-17 14 views
104

tôi đang gặp khó khăn về tìm kiếm thông tin có thẩm quyền về hành vi với HTTP GET chuỗi truy vấn trùng lặp các lĩnh vực, nhưvị trí Authoritative các phím truy vấn HTTP GET trùng lặp

http://example.com/page?field=foo&field=bar 

và đặc biệt là nếu lệnh được lưu giữ hay không. Hầu hết các ngôn ngữ theo định hướng web tạo ra một mảng chứa cả foo và thanh được liên kết với một trường "khóa", nhưng tôi muốn biết nếu tồn tại câu lệnh có thẩm quyền (ví dụ: trên RFC) về điểm này. RFC 3986 có một phần 3.4. Query, trong đó đề cập đến cặp khóa = giá trị, nhưng không có gì được nói về cách diễn giải trật tự và trường trùng lặp, v.v. Điều này có ý nghĩa, vì nó phụ thuộc vào phụ thuộc, và không nằm trong phạm vi của RFC đó ...

Mặc dù một tiêu chuẩn thực tế tồn tại, tôi muốn thấy một nguồn có thẩm quyền cho nó, chỉ vì tò mò.

+0

Bạn cũng thắc mắc về điều đó. Một điều nữa là spec về việc sáp nhập các tham số từ chuỗi truy vấn với các tham số trong phần thân POST. – Thilo

+0

Tại trang trại mã, mọi người nói rằng không có bảo đảm đặt hàng. Nhưng luồng đó cũ và không ai sao lưu nó theo bất kỳ cách nào: http://www.coderanch.com/t/357197/Servlets/java/getParameterValues-order – Thilo

+1

Ngoài máy chủ giữ thứ tự của chuỗi truy vấn, đó cũng là câu hỏi về trình duyệt gửi chúng theo thứ tự DOM (hoặc một số thứ tự cố định khác). – Thilo

Trả lời

82

không có thông số kỹ thuật về điều này. Bạn có thể làm những gì bạn thích.

Các cách tiếp cận điển hình bao gồm: được cho trước, được cho trước, mảng-tất cả, chuỗi liên kết với dấu phẩy-tất cả.

Giả sử yêu cầu nguyên liệu là:

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1 
Host: example.com 

Sau đó, có những lựa chọn khác nhau cho những gì request.query['tag'] nên năng suất, tùy thuộc vào ngôn ngữ hoặc khuôn khổ:

request.query['tag'] => 'ruby' 
request.query['tag'] => 'rails' 
request.query['tag'] => ['ruby', 'rails'] 
request.query['tag'] => 'ruby,rails' 
+8

Thêm vào điểm của câu hỏi, cũng có tùy chọn ['ray', 'ruby'] (thứ tự khác). – Thilo

+1

Người ta chắc chắn có thể làm rất nhiều thứ. – yfeldblum

+6

.NET sẽ cung cấp cho bạn như một mảng (tôi không quan tâm đến thứ tự khi tôi kiểm tra), PHP sẽ cung cấp cho bạn luôn là cuối cùng và Java (ít nhất là hệ thống tôi làm việc dựa trên Java) luôn là giá trị đầu tiên. http://stackoverflow.com/questions/1809494/post-the-checkboxes-that-are-unchecked/8972025#8972025 – SimonSimCity

3

Thông thường, giá trị tham số trùng lặp như

http://example.com/page?field=foo&field=bar 

kết quả trong một tham số chuỗi truy vấn duy nhất mà là một mảng:

field[0]=='foo' 
field[1]=='bar' 

Tôi đã nhìn thấy hành vi này trong ASP, ASP.NET và PHP4.

+0

chính xác, đây là tiêu chuẩn thực tế, nhưng theo như tôi thấy không có quyết định có thẩm quyền về nó. Vì tôi không tin rằng đây là trường hợp, tôi chỉ là không thể tìm thấy nó. –

+1

Có, có thể mọi người đã thấy hành vi đó. Câu hỏi đặt ra là nếu điều đó thực sự được chỉ định ở đâu đó. – Thilo

4

Hầu hết (tất cả?) Của các khung cung cấp không đảm bảo, do đó giả sử chúng sẽ được trả về theo thứ tự ngẫu nhiên.

Luôn sử dụng phương pháp an toàn nhất.

Ví dụ, java HttpServlet giao diện: (. Thứ tự của một iterator java.util.Map không thể dựa vào một trong hai) ServletRequest.html#getParameterValues

Ngay cả những phương pháp getParameterMap lá ra bất kỳ đề cập về trật tự tham số

12

tôi có thể xác nhận rằng cho PHP (ít nhất trong phiên bản 4.4.4 và mới hơn) nó hoạt động như thế này:

GET /blog/posts?tag=ruby&tag=rails HTTP/1.1 
Host: example.com 

kết quả trong:

request.query['tag'] => 'rails' 

Nhưng

GET /blog/posts?tag[]=ruby&tag[]=rails HTTP/1.1 
Host: example.com 

kết quả trong:

request.query['tag'] => ['ruby', 'rails'] 

Hành vi này là như nhau cho GET và POST dữ liệu.

+1

Hậu tố '[]' có vẻ như hành vi thực sự lạ, nhưng nếu bạn cố gắng gửi một mảng như một đối số thông qua '.ajax()' của jQuery, thì nó sẽ tự động thêm chúng cho bạn theo cách tương tự. Có vẻ như đây là lợi ích của người dùng PHP. –

+4

@IanClark Nó trực quan với các trình lập trình PHP - trong PHP đơn giản, '$ foo [] = 1' nối thêm vào một mảng. Django (Python) cũng làm điều tương tự. – Izkata

4

câu trả lời của yfeldblum là hoàn hảo.

Chỉ cần một lưu ý về một hành vi thứ năm tôi nhận thấy thời gian gần đây: trên Windows Phone, mở một ứng dụng có uri với một phím truy vấn trùng lặp sẽ dẫn đến NavigationFailed với:

System.ArgumentException: Một item với cùng một khóa đã được thêm vào.

Thủ phạm là System.Windows.Navigation.UriParsingHelper.InternalUriParseQueryStringToDictionary(Uri uri, Boolean decodeResults).

Vì vậy, hệ thống sẽ không cho phép bạn xử lý theo cách bạn muốn, hệ thống sẽ cấm. Bạn còn lại với giải pháp duy nhất để chọn định dạng của riêng bạn (CSV, JSON, XML, ...) và uri-escape-it.

+1

Điều đó có vẻ giống như một lỗi nội bộ của hàm đó, chứ không phải là một lựa chọn thiết kế. Hàm có thể không kiểm tra các khóa trùng lặp trong Từ điển mà nó tạo ra. Từ điển, tất nhiên, yêu cầu các khóa duy nhất. – gligoran

0

Tôi có cùng một câu hỏi. Tôi đang viết hàm javascript để phân tích cú pháp và xâu chuỗi các truy vấn. Tôi không biết liệu chuỗi truy vấn có tên trùng lặp hay tên có ngoặc vuông hay không, chẳng hạn như x [] = 1 & x [] = 2, là tiêu chuẩn mặc dù một số ngôn ngữ hỗ trợ định dạng này.

Nhưng tôi thấy Chrome và Firefox có Lớp mới có tên là URLSeachParams và chỉ hỗ trợ định dạng đơn giản nhất là name=value. Nếu có tên trùng lặp trong chuỗi truy vấn, phương thức get của URLSearchParams chỉ trả lại tên đầu tiên.

Vì vậy, cá nhân, có thể một url tên đơn giản và không trùng lặp sẽ an toàn hơn nhiều trong tương lai.

+0

* Nếu có tên trùng lặp trong chuỗi truy vấn, phương thức get của URLSearchParams chỉ trả về giá trị đầu tiên. * Điều này không đúng: bạn có thể truy xuất tất cả giá trị dưới dạng mảng bằng cách sử dụng ['URLSearchParams.getAll ('x')'] (https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/getAll) – Blaise

Các vấn đề liên quan