Ecobe API と通信するために JSON を URL に直接渡そうとしています。データをどのようにフォーマットしようとしても、URL でエスケープされます。呼び出しで構成パラメーターを渡すことを許可するために使用され、エンコードを停止するオプションがありましたが、削除されました (したがって、このスレッドの回答は機能しなくなりました)。ドキュメントで見ることができる唯一の参照は、requests.defaultsの何かへの参照ですが、それを設定する方法がわかりません。このため、私の URL では、API が必要としているように見えるのではなく、すべての JSON 形式が URL エスケープされています。
GET https://api.ecobee.com/1/runtimeReport?format=json&body={"startDate": "2010-01-01","endDate": "2010-01-02","columns": "zoneHVACmode,zoneCalendarEvent","selection":{"selectionType":"thermostats","selectionMatch": 123456789012"}}
さらに、私は十分な散弾銃のアプローチを試しました(このスレッドのものを含む)。これが機能した場合、これを行うための最良/最も効率的な方法がわからないので、場合に備えて現在のコード(の短縮版)を示しますより良いオプションがあります:
self.api_url = 'https://api.ecobee.com/%s?format=json&%s'
data = {
'startDate': start_date.strftime('%Y-%m-%d'),
'endDate': end_date.strftime('%Y-%m-%d'),
'columns': 'auxHeat1,compCool1,outdoorHumidity,zoneAveTemp,zoneCoolTemp,zoneHeatTemp',
'includeSensors': 'true',
'selection': self.selection_info
}
endpoint = 'runtimeReport'
params_json = simplejson.dumps(params)
response = requests.get(self.api_url % (endpoint, params_json), headers=self._get_headers())