概要
Ruby+MechanizeでPOSTリクエストをしようと思ったのですが、調べてみるとフォームを選択して...ってやり方がたくさん出てきたので、そうではなく純粋なpostリクエストをする方法を紹介する
だめだった例
パターン1
自分がやってみて行けそうだったけどだめだった書き方
require 'mechanize'
agent = Mechanize.new
payload = {
text: 'こんにちわ'
}
page = agent.post('https://xxx.yyyy.zzz', payload)
一見POSTできそうなのですが、
/var/task/vendor/bundle/ruby/2.7.0/gems/mechanize-2.8.5/lib/mechanize/http/agent.rb:333:in `fetch': 400 => Net::HTTPBadRequest for https://xxx.yyyy.zzz -- unhandled response (Mechanize::ResponseCodeError)
これではだめでした...
パターン2
次に試したのがpayloadのデータをto_json
する方法
require 'mechanize'
require 'json'
agent = Mechanize.new
payload = {
text: 'こんにちわ'
}
page = agent.post('https://xxx.yyyy.zzz', payload.to_json)
これも同様のエラーが出てだめでした
/var/task/vendor/bundle/ruby/2.7.0/gems/mechanize-2.8.5/lib/mechanize/http/agent.rb:333:in `fetch': 400 => Net::HTTPBadRequest for https://xxx.yyyy.zzz -- unhandled response (Mechanize::ResponseCodeError)
うまくいったコード
require 'mechanize'
require 'json'
agent = Mechanize.new
payload = {
text: 'こんにちわ'
}
page = agent.post('https://xxx.yyyy.zzz', payload.to_json, {'Content-Type' => 'application/json'})
失敗2にプラスしてContent-Type
を指定しました。
これで問題なくPOSTできました!!