コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

カールなんていらない

カールとか知らないマンがカールに挑戦した

はい。どうもカールおじさんとか知らない世代マンです。そんな僕が本日はカールに挑戦していきたいと思います。果たして一体僕はどうなってしまうのでしょうか……?

(エリア限定品)明治 カールチーズあじ 64g×10袋

(エリア限定品)明治 カールチーズあじ 64g×10袋

というくだらない食レポネタを考えたんですけどいかがですかね。僕はダメだと思う…。でも東日本では買うことのできない幻のお菓子だということだけは伝えたかった………。



まあ、そういう茶番どうでもいいっすね。

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番台のレスポンス全部例外扱いになるっぽい。そしてエラー時にログ吐いてくれない…、ちゃんとエラー対応してやらないとレスポンスが取得できないんですね……。とりあえずコードぐちゃぐちゃだけどまあこれで解けたのでこれで……。