通常、Nature APIで照明をオンにするには以下のようにPOSTする。
curl -X POST 'https://api.nature.global/1/appliances/{applianceID}/light' \
-H 'accept: application/json' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Authorization: Bearer {TOKEN}' \
-d 'button=on'
これをPythonで実行しようとした場合、urllib.error.HTTPError: HTTP Error 400: Bad Request
というエラーが出た。
from urllib.request import *
import json
token = 'XXXXXX'
headers = {
'accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Bearer {}'.format(token),
}
data = json.dumps({"button":"on"}).encode()
url = 'https://api.nature.global/1/appliances/902dee41-491c-4588-ba15-966e99c46c4b/light'
req = Request(url=url, data=data, headers=headers, method='POST')
with urlopen(req) as res:
body = res.read().decode()
print(body)
解決策
HTTPレスポンスの400とは、パラメーターに不正がある場合に生じる。
curlでは正常に動作したので、データの部分をJSON形式ではなく、クエリ文字列で指定したところ、うまく動作した。
data = b'button=on'
Nature APIのサーバー側がJSONに対応していないのか?