Windows 版 curl コマンドでパラメータとして JSON を POST する時の注意点
どうも、かげさんです(^^)/
あなたがこの記事を読んでいるのは何回目でしょうか?
初めての方、いらっしゃい!
複数回目の方、再訪問ありがとです(・∀・)
これまで Windows 版の curl コマンドの操作は情報取得が中心だったので GET を使っていました。
次は JSON 形式のパラメータを指定して curl コマンドを実行したい。
実は、これまで POST を使ったことがなかったのです(;^_^A
この記事を読むと、Windows 版 curl コマンドで JSON を POST する時の注意点であるエスケープシーケンスについて分かります。
また、この記事は、下記の SwitchBot 加湿器を curl コマンドで操作する SwitchBot API の話の続きでもあります。
- SwitchBot 加湿器を購入しました(購入3ヶ月後のレビューと SwitchBot API 情報も追記)
- SwitchBot API を使う前準備
- SwitchBot 関連デバイスのリストを API を使って取得する
- SwitchBot 加湿器の情報(ステータス)を取得するコマンド
ここまでは GET を使うだけで良かったんだけど、SwitchBot 加湿器の電源オン/オフするには、オンかオフかをパラメータとして指定しないとイケない。
ということで、POST が必要になった。
SwitchBot 加湿器を On にするには、次の json 形式のパラメータが必要になります。
{"command": "turnOn","parameter": "default","commandType": "command"}
パラメータの意味は
- コマンドは、turnOn(ほとんどのSwitchBotシリーズではturnOnは電源オンを意味する)
- パラメータは、default(初期値)
- コマンドタイプは、command
となっている。
Windows の curl でパラメータを記入するには、-d "パラメータ情報"とする必要がある。
しかし何も考えずに
-d "{"command": "turnOn","parameter": "default","commandType": "command"}"
として、下記のコマンドを入力してもエラーが出てしまう。
(横に長いのでスクロールしてください)
curl -X POST "https://api.switch-bot.com/v1.0/devices/dddddddddddd/commands" -H "Authorization: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d "{"command": "turnOn","parameter": "default","commandType": "command"}"
エラーが出てしまう原因は、くくり文字である「"」に囲まれた "~" の~部分にも " が含まれているから。
-d "{"command": "turnOn","parameter": "default","commandType": "command"}"
では
-d "{"command": "turnOn","parameter": "default","commandType": "command"}"
ダブルクォーテーションでくくられた文字として認識されるのは上行の赤文字のところです。
本来は、-d "{"command": "turnOn","parameter": "default","commandType": "command"}"
と認識してほしい。
でも、「"」 でくくられた文字の中で出てくる「"」は特殊記号(そのままだと最初の"に対応する閉じる"と判断されてしまう)
このため、途中で出てくる「"」 を「\"」にしてやる必要がある。正しくは一番外側の「”」以外は、こうなります。
-d "{\"command\": \"turnOff\",\"parameter\": \"default\",\"commandType\": \"command\"}"
\ はバックスラッシュで表示されているかもしれせんが、日本語キーボードだと¥(円マーク)です。
特殊記号の前に \ を入力する方式を「エスケープシーケンス」と言います。
正しいコマンド入力だと下記のようになります。
(横に長いのでスクロールしてください)
curl -X POST "https://api.switch-bot.com/v1.0/devices/dddddddddddd/commands" -H "Authorization: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -H "Content-Type: application/json" -d "{\"command\": \"turnOff\",\"parameter\": \"default\",\"commandType\": \"command\"}"
▼2022/02/20追記 ここから
元々、くくり文字と同じ文字が囲まれた文字に含まれているからなぁと、かげさんも予想していました。
エスケープシーケンスの問題はよくある問題だからです。
なので何も考えずにエスケープシーケンスを使ったら動いた。
一応、裏を取るためにネットで調べたらQiita(キータ)に「Windows版curlでJSONをPOSTする際に困った話」という記事を見つけました。
このQiitaの記事では、WireShark(ワイヤーシャーク)というパケットキャプチャソフトを使って原因を突き止めていました。
実は、WireShark を使う部分でも参考になりました。
ちなみにこのブログにも WireShark(ワイヤーシャーク)に関する記事があります。
コチラです。
▲2022/02/20追記 ここまで
ここまではOKだ
下記の SwitchBot 加湿器を操作するコマンドをまとめた記事はコチラ ➡「SwitchBot API を使った SwitchBot 加湿器の curl コマンド(まとめ)」
フィルターは活性炭を使用して、ホコリや花粉や微小な粒子まで素早く集めて集じんします。
ご使用状況によっては、お手入れや交換が必要です。フィルターの交換は早めの半年に1回交換がおすすめです。
コメント
このブログの新着コメントをRSSリーダに登録する為のxml