環境
- Rails 5以降
経緯
そもそもRaw post dataとはなんぞや、から。
RailsでRequest Specを書く場合、当然POSTメソッドのテストも書くケースがある。
そんなときはこんな感じになると思う。
# spec/requests/logins_spec.rb require "rails_helper" RSpec.describe "Sessions", type: :request do describe "POST /login" do context "xxxなとき" do before do post login_path, params: { email: "aaa@example.com" } end it "xxxすること" do # 略 end end end end
重要なのは post login_path, params: { email: "aaa@example.com" }
で、これでPOST送信できる。
このときのPOST送信をcurlに書き換えてみると
curl -X POST -F 'email=aaa@example.com’ http://example.com/login
となり、よくある<form>
のHTMLフォームからsubmitした挙動と同じパラメータで渡すことができる。
このときのContent-Typeはmultipart/form-dataになる。
が、歴史的経緯によりraw post dataなPOSTで受け取る場合、上のテストが使えない。
具体的にcurlで表すと
curl -X POST -d 'email=aaa@example.com' http://example.com/login
の場合。
やり方
params引数に文字列を渡すと暗黙的にRaw post dataなPOSTになる
post '/path', params: '{"foo": "bar", "bool": true}', headers: { 'Content-Type' => 'application/json' }
これで Controller側では request.body.read
で中身が受け取れると思う。
使うケースは少ないかもだが、、