RailsのAPIアプリケーション開発時にPOSTで+記号を受け取ったら空白に変換されて困った話

この記事を書いたひと: @t4traw 2019年2月15日

RailsでAPIアプリケーションを開発していて、user_sessionの部分をいざ本番サーバーでテストしようとしたら、うまく動きませんでした。

送ったのはこんな感じのリクエスト。

$ curl -i -X POST http://example.com/api/user_sessions.json -d 'user[email]=t4traw+6@gmail.com' -d 'user[password]=password'

具体的にはUserが見つからないといった具合。試しにブラウザからログインしたり開発環境でも試した見たり。でもすぐに分かりませんでした。

「えー……」と思ってログを見ていたら、dbのログが

SELECT  "users".* FROM "users" WHERE "users"."email" = 't4traw 6@gmail.com' ORDER BY "users"."id" ASC LIMIT $1

となっているのに気づきました。

emailの部分にあるはずの+記号がありません。ないというか、空白になってしまっています。

本番では実際にメールが送られてしまうため、自分のメールアドレス+エイリアスといった感じで動作テストをしていたのでした。

あれ、curlだとエスケープしないといけない?と思って\+とやっても\と空白に変換されます。

具体的に何がだめっぽいのか分かったので検索してみると、

curlコマンドによるデータ送信あれこれ - wagavulin’s blog

--data-urlencodeでurlencodeしてくれる事がわかりました。

ので、さっそく

$ curl -i -X POST http://example.com/api/user_sessions.json --data-urlencode "user[email]=t4traw+6@gmail.com" --data-urlencode "user[password]=password"

してみたところ、無事動作しました😆

それでは。