2014-12-09 15 views
5

Tôi đã gửi yêu cầu POST tới ứng dụng Sinatra. Tôi nhận thấy rằng các tham số đến trong máy chủ như một StringIO. Nó có thể được đọc bằng cách sử dụng request.body.read. Tuy nhiên, nó chỉ có thể được đọc một lần. Để đọc lại, tôi cần chạy request.body.rewind (haha, Sinatra).Tại sao Sinatra cần phải tua lại thân yêu cầu?

Tại sao thiết bị được thiết kế theo cách này? Tôi có thể thấy điều này hữu ích trong việc truyền dữ liệu nhưng có các ứng dụng khác không?

+0

Tôi cũng tự hỏi về điều này từ [ví dụ về webhook GitHub] (https://developer.github.com/webhooks/securing/). – Leo

Trả lời

3

Các tham số có sẵn trong Sinatra thông qua hàm băm params. request.body.readrequest.body.rewind là một phần của Rack, chúng không thực sự được triển khai trong Sinatra. Cách phổ biến nhất mà tôi đã sử dụng trong quá khứ là khi tôi đang sử dụng Sinatra đúng như một API web và tuần tự hóa/de-serializing tải trọng của tôi.

+0

Câu hỏi hỏi tại sao: Tôi muốn đọc câu trả lời (tôi đã bỏ phiếu cho câu hỏi) – MastroGeppetto

+0

Đó là một đối tượng IO được đệm vào một tệp và cần được đọc theo thứ tự nhận được cho những thứ như tải lên tệp hoặc phát trực tuyến . Ngoài ra bạn có các lớp của middleware giá mà có thể đã đọc cơ thể là tốt, do đó bạn cần để có thể quay trở lại đầu khi cần thiết. Một middleware được xử lý tốt sẽ đọc rồi tua lại. – bigtunacan

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