カールとか知らないマンがカールに挑戦した
はい。どうもカールおじさんとか知らない世代マンです。そんな僕が本日はカールに挑戦していきたいと思います。果たして一体僕はどうなってしまうのでしょうか……?
- 出版社/メーカー: 明治
- 発売日: 2015/07/28
- メディア: 食品&飲料
- この商品を含むブログ (5件) を見る
というくだらない食レポネタを考えたんですけどいかがですかね。僕はダメだと思う…。でも東日本では買うことのできない幻のお菓子だということだけは伝えたかった………。
まあ、そういう茶番どうでもいいっすね。
challenge-your-limits.herokuapp.com
というわけでカールつながりで、これを「Invoke-RestMethod」で解いていこうと思います。今回は普通にネタバレしながら書きます。ただしcurlは使いません。カールつながりなのにカールは使わないwww。
参考:Invoke-RestMethod
Invoke-RestMethod
PowerShellにはcurl的なことができるこんなのがあるらしいので使ってみることにした。理由はそれだけです。curlとの違いはJSONなんかをちゃんとパースしてくれるとことからしい。とりあえずどんな機能なのかいじってみたくて使ってみることにした。
Invoke-RestMethod -Uri "URL" -Method {メソッド(GET、POSTなど)}
ちゃちゃっと使うには上みたいな感じで使えるとのこと。そうなんだ、じゃあ僕はWSLでcurl使うね!
そんわけで、上記サイトの問題のネタバレありなのでとりあえず続きを読むでワンクッション置いときます。解いてみました。
やってみた
# ログの取得 Start-Transcript C:****\log.txt -Append # GET /call/me try{ Invoke-RestMethod -Uri "http://challenge-your-limits.herokuapp.com/call/me" -Method GET | Out-Default }catch{ } ### GETじゃないとか言われます # POST /call/me try{ Invoke-RestMethod -Uri "http://challenge-your-limits.herokuapp.com/call/me" -Method POST | Out-Default }catch{ } ### /challenge_users で登録しろとか言われます # POST /challenge_users try{ Invoke-RestMethod -Uri "http://challenge-your-limits.herokuapp.com/challenge_users" -Method POST | Out-Default }catch{ Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription # レスポンス文字列取得 $reader = New-Object System.IO.StreamReader $_.Exception.Response.GetResponseStream() $reader.BaseStream.Position = 0 $reader.DiscardBufferedData() $responseBody = $reader.ReadToEnd() Write-Host "Response:" $responseBody } ### nameが空白と言われる # POST /challenge_users @{name=" "} try{ Invoke-RestMethod -Uri "http://challenge-your-limits.herokuapp.com/challenge_users" -Method POST -Body @{name="名前"} }catch{ Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription $reader = New-Object System.IO.StreamReader $_.Exception.Response.GetResponseStream() $reader.BaseStream.Position = 0 $reader.DiscardBufferedData() $responseBody = $reader.ReadToEnd() Write-Host "Response:" $responseBody } ### emailも登録しろと言われます # POST /challenge_users @{name=" "; email=" "} try{ Invoke-RestMethod -Uri "http://challenge-your-limits.herokuapp.com/challenge_users" -Method POST -Body @{name="名前"; email="メールアドレス"} | Out-Default }catch{ Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription $reader = New-Object System.IO.StreamReader $_.Exception.Response.GetResponseStream() $reader.BaseStream.Position = 0 $reader.DiscardBufferedData() $responseBody = $reader.ReadToEnd() Write-Host "Response:" $responseBody } ### クリア # ログ取得終了 Stop-Transcript
とりあえずカールなしでも解くことできました―!!いぇーーーい。
おわり
WebException Class (System.Net) | Microsoft Docs
なんか「Invoke-RestMethod」ステータスコード400番台のレスポンス全部例外扱いになるっぽい。そしてエラー時にログ吐いてくれない…、ちゃんとエラー対応してやらないとレスポンスが取得できないんですね……。とりあえずコードぐちゃぐちゃだけどまあこれで解けたのでこれで……。