1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

下位10%のダメなエンジニアにだけ解けないパズルにチャレンジしてみた

Last updated at Posted at 2020-06-24

タイトルにあるようなパズルが数年前流行ったとのこと、
見つけたのでチャレンジ。

パズル

まずはブラウザに直接打ち込んでみる。
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歩前進かな。

日々精進。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?