前提・実現したいこと
Python3のrequestsモジュールを使って外部APIからデータを取得したいのですが、
ベンダーから提供されているAPI仕様書に則ってリクエストを送ってもステータスコード400が返ってきて上手くいきません。
ベンダーからはPHPで以下のサンプルコードが送られてきており、自分のローカルにPHPの実行環境を作って実行したところ、
上手く動作しました。
こちらが作るアプリケーションの言語はPython3で決定しているのでこれをPython3で書き直したいのです。。
なお、ベンダーから提供されているAPI仕様書には以下の指定があります。
HTTPメソッド:GET
リクエストヘッダに以下のパラメータを付与する
要素名 | 説明 |
---|---|
Content-Type | application/json; charset=UTF-8 |
X-Auth | 「ID:パスワード」をBASE64エンコードしたもの |
リクエストボディに以下の検索条件を付与しJSON形式で送る
キー | 説明 |
---|---|
from | 開始時刻 |
to | 終了時刻 |
ベンダーから提供されたPHPのサンプルコード
PHP
1<?php 2$loginName = 'username'; 3$password = 'password'; 4 5$header = array( 6 'Content-type: application/json; charset=UTF-8', 7 'X-Auth:' . base64_encode($loginName . ':' . $password), 8 ); 9 10$context = stream_context_create( 11 array( 12 'http' => array( 13 'method'=> 'GET', 14 'header'=> implode("\r\n", $header), 15 'content' => json_encode( 16 array( 17 'from' => '2018-07-01 00:00:00', 18 'to' => '2018-07-27 23:59:00', 19 'maximumresponse' => '1000' 20 ) 21 ,JSON_UNESCAPED_UNICODE) 22 ) 23 ) 24); 25 26print file_get_contents('https://xxxxxxxxx.jp/api/v1/hoge.json', false, $context); 27?>
サンプルコードを実行すると以下のようなJSONのレスポンスが得られます。
JSON
1{ 2 "result":"000000", 3 "accepttime":"2018-08-08T17:26:41+09:00", 4 "count":1, 5 : 6 以下略 7 : 8}
PHPのコードの $context
の中身は以下の通りです。
PHP
1php > var_dump(stream_context_get_params($context)); 2array(1) { 3 ["options"]=> 4 array(1) { 5 ["http"]=> 6 array(3) { 7 ["method"]=> 8 string(3) "GET" 9 ["header"]=> 10 string(116) "Content-type: application/json; charset=UTF-8 11X-Auth:******************************" 12 ["content"]=> 13 string(82) "{"from":"2018-07-01 00:00:00","to":"2018-07-27 23:59:00","maximumresponse":"1000"}" 14 } 15 } 16}
自分が書いたPython3のコード(上手くいかない)
Python3
1import base64 2import requests 3import json 4 5 6ID = 'username' 7PASS = 'password' 8URL = 'https://xxxxxxxxx.jp/api/v1/hoge.json' 9auth_str = ID + ':' + PASS 10 11authkey = base64.b64encode(auth_str.encode('utf-8')).decode() 12 13headers = { 14 'Content-Type': 'application/json; charset=UTF-8', 15 'X-Auth': authkey 16} 17 18payload = { 19 'from': '2018-07-01 00:00:00', 20 'to': '2018-07-27 23:59:00', 21 'maximumresponse': 1000 22} 23 24r = requests.get(URL, headers=headers, json=payload)
このコードを実行したら以下のようにHTTPのステータスコードが400になります。
>>> r = requests.get(URL, headers=headers, json=payload) >>> r.status_code 400
試したこと
ちなみにリクエストを送る際の引数を変えてみたりしましたがダメでした…。
Python3
1>>> r = requests.get(URL, headers=headers, params=json.dumps(payload)) 2>>> r.status_code 3400
補足情報(FW/ツールのバージョンなど)
実行環境は以下の通りです。
- Python3.6
- requests2.19.1
当然、パラメータはサンプルコードに記載されたものと全く同じにしているのでパラメータに問題はなく、Pythonのコードの問題だと思っています。
お知恵を貸していただければ幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/09 00:12
2018/08/09 00:43
2018/08/09 01:31