web-dev-qa-db-ja.com

requests.postを使用して配列を送信する方法(Python)? 「値エラー:解凍する値が多すぎます」

私はrequests.postを使用してリクエストの配列(リスト)をWheniWork APIに送信しようとしていますが、2つのエラーのうちの1つを受け取り続けています。リストをリストとして送信すると、アンパックエラーが発生し、文字列として送信すると、配列の送信を要求するエラーが発生します。リクエストがリストを処理する方法と関係があると思います。以下に例を示します。

url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data=[{'url': '/rest/shifts', 'params': {'user_id': 0,'other_stuff':'value'}, 'method':'post',{'url': '/rest/shifts', 'params': {'user_id': 1,'other_stuff':'value'}, 'method':'post'}]
r = requests.post(url, headers=headers,data=data)
print r.text

# ValueError: too many values to unpack

データの値を引用符で囲むだけです:

url='https://api.wheniwork.com/2/batch'
headers={"W-Token": "Ilovemyboss"}
data="[]" #removed the data here to emphasize that the only change is the quotes
r = requests.post(url, headers=headers,data=data)
print r.text

#{"error":"Please include an array of requests to make.","code":5000}
41
Bobby Battista

JSONエンコードデータを渡します。 APIドキュメント を参照してください:

要確認—すべての投稿本文はJSON形式のデータ(フォームデータなし)である必要があります。

requestsライブラリを使用すると、これは非常に簡単になります。

headers = {"W-Token": "Ilovemyboss"}
data = [
    {
        'url': '/rest/shifts',
        'params': {'user_id': 0, 'other_stuff': 'value'},
        'method': 'post',
    },
    {
        'url': '/rest/shifts',
        'params': {'user_id': 1,'other_stuff': 'value'},
        'method':'post',
    },
]
requests.post(url, json=data, headers=headers)

jsonキーワード引数を使用すると、データはJSONにエンコードされ、Content-Typeヘッダーはapplication/jsonに設定されます。

64
Martijn Pieters

さて、私がする必要があるのは、これらのヘッダーを追加することだけでした:

headers = {'Content-Type': 'application/json', 'Accept':'application/json'}

その後、呼び出し要求

requests.post(url,data=json.dumps(payload), headers=headers)

そして今、私は元気です!

14
elad silver

array(list)またはdictionaryHTTP POSTリクエスト、post関数でjson argumentを使用して設定しますあなたのarray(list)/ dictionaryへの値。

あなたの場合、それは次のようになります:

r = requests.post(url、headers = headers、json = data)

注:POST要求は、ボディのパラメーターのコンテンツタイプを暗黙的にapplication/jsonに変換します。

簡単な紹介を読むには API-Integration-In-Python

3
MHBN