2011-06-24 80 views
12

Trong Rails 3 (Ruby 1.9.2) Tôi gửi một yêu cầuRails: Thêm đăng nhập GET-Yêu cầu thay thế bằng không gian

Started GET "/controller/action?path=/41_+" 

Nhưng danh sách tham số trông như thế này:

{"path"=>"/41_ ", 
    "controller"=>"controller", 
    "action"=>"action"} 

Whats đi sai ở đây? Các dấu hiệu -, * hoặc . hoạt động tốt, chỉ là + sẽ được thay thế bằng khoảng trắng.

+0

Bạn đã kiểm tra với nhau trình duyệt ?? –

+0

Tôi đã kiểm tra nó trên các phiên bản Firefox, Chrome và Safari gần đây. – Fu86

Trả lời

19

Đó là mã hóa URL bình thường, the plus sign is a shorthand for a space:

Trong chuỗi truy vấn, dấu cộng được dành riêng như ký hiệu viết tắt cho một không gian. Do đó, dấu cộng thực phải được mã hóa. Phương pháp này được sử dụng để làm cho các URI truy vấn dễ dàng hơn trong các hệ thống không cho phép các khoảng trống.

Và từ HTML5 standard:

Nhân vật là một U + 0020 SPACE nhân vật
Thay nhân vật với một nhân vật SIGN đơn U + 002B PLUS (+).

+1

Tôi sẽ đến Whistler và trò chuyện với bạn. Bạn không thể tin được. – Zabba

+2

Vậy làm thế nào để bạn có được Rails thoát khỏi '+' trong tham số sao cho nó được nhận như là một '+'? – Zabba

+0

@Zabba: Chỉ cần đến vào mùa đông để chúng ta có thể đi trượt tuyết. –

2

Đối POST-yêu cầu, (trong trường hợp đó là cách một số bạn stumbled khi câu hỏi này, như tôi) người ta có thể gặp phải vấn đề này bởi vì ai đã mã hóa các dữ liệu trong một cách sai lầm về phía khách hàng. Mã hóa các dữ liệu như application/x-www-form-urlencoded sẽ cho đường ray để giải mã dữ liệu khi nó giải mã URL, và do đó thay thế dấu hiệu + với khoảng trắng, theo tiêu chuẩn RFC1738 như explained bởi @mu là quá ngắn

Giải pháp là để mã hóa dữ liệu ở phía máy khách là multipart/form-data.

Trong PHP, sử dụng cURL, điều này được thực hiện bằng cách xem xét các Gotcha sau:

Đi qua một mảng để CURLOPT_POSTFIELDS sẽ mã hóa các dữ liệu như multipart/form-data, trong khi đi qua một URL được mã hóa chuỗi sẽ mã hóa dữ liệu dưới dạng ứng dụng/x-www-form-urlencoded. http://php.net/manual/en/function.curl-setopt.php

Bạn có thể tự hỏi tại sao tôi đã sử dụng PHP trên các mặt hàng (đó là vì khách hàng trong ví dụ của tôi là máy chủ web khác, kể từ khi tôi đang làm việc trên một kết nối API.)

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