Bối cảnh (câu hỏi thêm xuống)
Tôi đã đọc đi đọc lại cái này trên Google để đọc các câu hỏi RFC và SO cố gắng giải mã này, nhưng tôi vẫn không có jack.
Vì vậy, tôi đoán chúng ta chỉ bỏ phiếu cho câu trả lời "tốt nhất" và đó là nó, hoặc?
Về cơ bản, nó tóm tắt về điều này.
3.4. Thành phần truy vấn
Thành phần truy vấn là một chuỗi thông tin được tài nguyên giải thích.
query = *uric
Trong thành phần truy vấn, các ký tự ";", "/", "?", ":", "@", "&", "=", "+", "," Và "$" được dành riêng.
Điều đầu tiên làm tôi bối rối là * uric được định nghĩa như thế này
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Tuy nhiên, điều này phần nào được làm rõ bởi các đoạn văn như
Lớp cú pháp "dành riêng" ở trên đề cập đến những ký tự được phép trong URI, nhưng có thể không được phép trong một thành phần cụ thể của cú pháp URI chung; chúng được sử dụng làm dấu phân cách của các thành phần được mô tả trong Phần 3.
Các ký tự trong tập hợp "dành riêng" không được bảo lưu trong mọi ngữ cảnh. Tập hợp các ký tự thực sự dành riêng trong bất kỳ thành phần URI nhất định nào được xác định bởi thành phần đó. Nói chung, một ký tự được dành riêng nếu ngữ nghĩa của URI thay đổi nếu ký tự được thay thế bằng mã hóa US-ASCII đã thoát của nó.
Đoạn trích cuối cùng này có cảm giác hơi ngược, nhưng nó nói rõ rằng dàn nhân vật được bảo lưu phụ thuộc vào ngữ cảnh. Tuy nhiên, 3.4 nói rằng tất cả các ký tự dành riêng đều được dành riêng trong một thành phần truy vấn, tuy nhiên, điều duy nhất có thể thay đổi ngữ nghĩa ở đây là thoát khỏi dấu hỏi (?) Vì URI không xác định khái niệm chuỗi truy vấn.
Tại thời điểm này, tôi đã từ bỏ hoàn toàn RFC nhưng thấy RFC 1738 đặc biệt thú vị.
URL HTTP có dạng:
http://<host>:<port>/<path>?<searchpart>
Trong các thành phần <path> và <searchpart>, "/", ";", "?" được đặt trước. Ký tự "/" có thể được sử dụng trong HTTP để chỉ định cấu trúc phân cấp.
Tôi giải thích điều này ít nhất là liên quan đến các URL HTTP mà RFC 1738 thay thế RFC 2396. Bởi vì truy vấn URI không có khái niệm về chuỗi truy vấn cũng như việc giải thích dành riêng không thực sự cho phép tôi xác định các chuỗi truy vấn như tôi đã quen hiện đang làm.
Câu hỏi
Tất cả điều này bắt đầu khi tôi muốn chuyển một danh sách các số cùng với yêu cầu của một tài nguyên khác. Tôi không nghĩ nhiều về nó và chỉ chuyển nó dưới dạng các giá trị được phân tách bằng dấu phẩy. Tôi ngạc nhiên mặc dù dấu phẩy đã được thoát ra. Truy vấn page.html?q=1,2,3
được mã hóa biến thành page.html?q=1%2C2%2C3
nó hoạt động, nhưng nó xấu xí và không mong đợi. Đó là khi tôi bắt đầu xem qua RFC.
Câu hỏi đầu tiên của tôi chỉ đơn giản là, mã hóa dấu phẩy có thực sự cần thiết không?
Câu trả lời của tôi, theo RFC 2396: có, theo RFC 1738: không
Sau đó, tôi tìm thấy các bài đăng liên quan về việc chuyển danh sách giữa các yêu cầu. Nơi mà cách tiếp cận csv được coi là tồi tệ. Điều này đã hiển thị thay thế, (chưa thấy điều này trước đây).
page.html?q=1;q=2;q=3
Câu hỏi thứ hai của tôi, đây có phải là một URL hợp lệ không?
Câu trả lời của tôi, theo RFC 2396: không, theo RFC 1738: không (; được bảo lưu)
Tôi không gặp bất kỳ vấn đề nào với việc chuyển csv miễn là đó là số, nhưng có, bạn có nguy cơ phải mã hóa và giải mã các giá trị qua lại nếu dấu phẩy đột nhiên cần cho việc khác. Dù sao tôi đã thử chuỗi truy vấn dấu chấm phẩy với ASP.NET và kết quả không như tôi mong đợi.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Tôi không thấy điều này khác biệt nhiều như thế nào so với cách tiếp cận csv vì khi tôi yêu cầu "a", tôi nhận được một chuỗi có dấu phẩy trong đó. ASP.NET chắc chắn không phải là một triển khai tham chiếu nhưng nó vẫn chưa làm tôi thất vọng.
Nhưng quan trọng nhất - câu hỏi thứ ba của tôi - đặc điểm kỹ thuật cho việc này là ở đâu? và bạn sẽ làm gì hoặc cho vấn đề đó không làm gì?