タイトルにあるようなパズルが数年前流行ったとのこと、
見つけたのでチャレンジ。
まずはブラウザに直接打ち込んでみる。
http://challenge-your-limits.herokuapp.com/call/me
すると、下記のようなテキストが帰ってきた。
{"message":"Almost! It's not GET. Keep trying."}
なるほどGETではないとのことなので、
POSTでリクエストしてみよう。
curlでやってもいいが、今回はRubyでリクエストを投げてみる。
require 'net/http'
uri = URI.parse('http://challenge-your-limits.herokuapp.com/call/me')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
response = http.request(req)
puts response.body
#=>{"message":"Great! Please register as /challenge_users"}
成功、そして次の課題が、
まずはパスを変えてそのままリクエスト。
require 'net/http'
uri = URI.parse('http://challenge-your-limits.herokuapp.com/challenge_users')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
response = http.request(req)
puts response.body
#=>{"message":"Validation Error, [:name, \"can't be blank\"]"}
パラメータを渡せって指示がきました。
POSTなのでリクエストボディにデータを入れ込む。
require 'net/http'
require 'json'
params = {
name: 'hogehoge'
}
uri = URI.parse('http://challenge-your-limits.herokuapp.com/challenge_users')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req.body = params.to_json
response = http.request(req)
puts response.body
#=> {"message":"Validation Error, [:name, \"can't be blank\"]"}
あれ?パラメータが渡せてない、
ここから熟考、、、そしてカンニング。笑
リクエストボディにjson形式でパラメータを入れているのが原因だった。
ボディはjsonでしょと思い込んでいたことを反省、、、
Net::HTTP::Postライブラリにはset_form_dataという便利なメソッドがあり、
引数にhashを渡せば文字列でパラメータをボディに入れてくれます。
require 'net/http'
params = {
name: 'hogehoge'
}
# 省略
req.set_form_data(params)
puts req.body
#=> name=hogehoge
puts req.body.class
#=> String
そして編集
require 'net/http'
params = {
name: 'hogehoge'
}
uri = URI.parse('http://challenge-your-limits.herokuapp.com/challenge_users')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req.set_form_data(params)
response = http.request(req)
puts response.body
#=> {"message":"Validation Error, [:email, \"can't be blank\"]"}
パラメータ指定が永遠に続くとかないよね?
指示通りemailを追加
require 'net/http'
params = {
name: 'hogehoge',
email: 'hogehogehoge@hogehoge.com'
}
uri = URI.parse('http://challenge-your-limits.herokuapp.com/challenge_users')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req.set_form_data(params)
response = http.request(req)
puts response.body
#=> {"message":"Validation Error, [:email, \"is already taken\"]"}
uniq: trueかよとか思いつつ、
別のアドレスを入れると成功しました。
{"message":"Thanks! Please access to http://challenge-your-limits.herokuapp.com/challenge_users/token/********** from your web browser."}
まだまだ下位10%だなぁと、自分の立ち位置を再確認できたよき機会でした。
POSTに関してリクエストパラメータの入れ込み知識がついたので、1歩前進かな。
日々精進。