質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

4781閲覧

POST時にパラメータを多次元辞書で送信したい

shun-shobon

総合スコア50

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/27 07:17

前提・実現したいこと

XreaのAPIドキュメント
こちらのAPIを使って、メールアドレスをPythonから登録しようと考えています。
このAPIドキュメントを見る限り、パラメーターを多次元辞書で送信しなきゃいけないようです。(JSON形式は使えないようです。)
PythonでrequestsをつかってPOSTしようとしているのですが、多次元辞書でパラメータを送信することはできるのでしょうか?

発生している問題・エラーメッセージ

実行すると以下のようなレスポンスが返ってきます。

{'status_code': 500, 'error_code': '100002', 'error_target': 'param not array ', 'message': 'param not array :正しくありません。'}

おそらくPOST時にパラメータが多次元辞書として送信されていないのだと思います。

該当のソースコード

Python

1import requests 2import json 3 4XREA_ACCOUNT = os.environ.get('XREA_ACCOUNT') #Xreaのアカウント名 5XREA_SERVER = os.environ.get('XREA_SERVER') #Xreaのサーバー名 6XREA_API_KEY = os.environ.get('XREA_API_KEY') #XreaのAPI_KEY 7XREA_DOMAIN = os.environ.get('XREA_DOMAIN') #Xreaの登録しているドメイン名 8 9def create_mail_account(user_id, password): 10 url = 'https://api.xrea.com/v1/mail/edit' 11 data_params = { 12 'account': XREA_ACCOUNT, 13 'server_name': XREA_SERVER, 14 'api_secret_key': XREA_API_KEY, 15 'param': { 16 'address_name': user_id, 17 'address_domain': XREA_DOMAIN, 18 'address': f'{user_id}@{XREA_DOMAIN}', 19 'force': 1, 20 'pop_how': 1, 21 'pop_pass': password, 22 'quota': 10, 23 'autorespond': 0, 24 'clamd': 1, 25 'spamd': 0, 26 'customd': 0 27 } 28 } 29 print(json.dumps(data_params)) # 一度ここで作った辞書データを確認しています。 30 res = requests.post(url, data=data_params) #ここでデータをPOSTしています。 31 res_json = json.loads(res.text) # レスポンスをjson形式に変換しています。 32 print(res_json) # jsonデータを確認しています 33 34 if res_json['status_code'] == 200: # ステータスコードが200(成功)ならTrueを返します。 35 return True 36 else: 37 return False

試したこと

この部分を

Python

1data_params = { 2 'account': XREA_ACCOUNT, 3 'server_name': XREA_SERVER, 4 'api_secret_key': XREA_API_KEY, 5 'param': { 6 'address_name': user_id, 7 'address_domain': XREA_DOMAIN, 8 'address': f'{user_id}@{XREA_DOMAIN}', 9 'force': 1, 10 'pop_how': 1, 11 'pop_pass': password, 12 'quota': 10, 13 'autorespond': 0, 14 'clamd': 1, 15 'spamd': 0, 16 'customd': 0 17 } 18 }

このようにしましたが、結果は何も変わりませんでした。

Python

1data_params = { 2 'account': XREA_ACCOUNT, 3 'server_name': XREA_SERVER, 4 'api_secret_key': XREA_API_KEY, 5 'param[address_name]': user_id, 6 'param[address_domain]': XREA_DOMAIN, 7 'param[address]': f'{user_id}@{XREA_DOMAIN}', 8 'param[force]': 1, 9 'param[pop_how]': 1, 10 'param[pop_pass]': password, 11 'param[quota]': 10, 12 'param[autorespond]': 0, 13 'param[clamd]': 1, 14 'param[spamd]': 0, 15 'param[customd]': 0 16}

また、ほかにも、res = requests.post(url, data=data_params)data=json=にしたりしましたがそうするとどうやらjsonデータを読み取ってないようです。

補足情報(FW/ツールのバージョンなど)

Pythonのバージョンは3.7.1です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

paramは配列になっていたようです。直接インデックスを指定してあげれば動きました。

Python

1data_params = { 2 'account': XREA_ACCOUNT, 3 'server_name': XREA_SERVER, 4 'api_secret_key': XREA_API_KEY, 5 'param[0][address_name]': user_id, 6 'param[0][address_domain]': XREA_DOMAIN, 7 'param[0][address]': f'{user_id}@{XREA_DOMAIN}', 8 'param[0][force]': 1, 9 'param[0][pop_how]': 2, 10 'param[0][pop_pass]': password, 11 'param[0][quota]': 100000, 12 'param[0][autorespond]': 0, 13 'param[0][clamd]': 1, 14 'param[0][spamd]': 0, 15 'param[0][customd]': 0 16}

投稿2019/01/29 13:15

shun-shobon

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ParamSampleみるかぎり、階層({...})がひとつ足りないのではないでしょうか。

JSON

1"param" : { 2 { <==== コレ 3 "address_name" : example, 4 "address_domain" : example.com, 5 "address" : example@example.com, 6 : 7 } <==== コレ 8 }

投稿2019/01/27 08:16

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun-shobon

2019/01/27 08:41

回答ありがとうございます。試したことには書かなかったのですがそれについても試しています。しかし{}はPythonでは辞書扱いになってしまうので違うんですよね…他の方法として{}ではなく[](配列)を使ってみたりしましたが、結果は同じでした。
shun-shobon

2019/01/29 13:12

自己解決しました。けっこう荒業ですがこれでいけます。 data_params = { 'account': XREA_ACCOUNT, 'server_name': XREA_SERVER, 'api_secret_key': XREA_API_KEY, 'param[0][address_name]': user_id, 'param[0][address_domain]': XREA_DOMAIN, 'param[0][address]': f'{user_id}@{XREA_DOMAIN}', 'param[0][force]': 1, 'param[0][pop_how]': 2, 'param[0][pop_pass]': password, 'param[0][quota]': 100000, 'param[0][autorespond]': 0, 'param[0][clamd]': 1, 'param[0][spamd]': 0, 'param[0][customd]': 0 } 直接指定すれば行けたんですね…
can110

2019/01/29 15:11

解決してよかったです。 ParamSampleがJSON形式でしか記載されていないのがちょっと謎(不親切)ですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問