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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1758閲覧

階層化されたパラメータが連携できない

PythonBegin

総合スコア3

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/16 14:20

困っていること

商品マスタを送信するためのAPI(SOAP通信)でリクエスト処理を実行するためのプログラムを
Pythonで作成しているのですが、リクエスト処理を実行するとValueErrorとなり、
うまくいきません(リクエストができていないため、レスポンスも返却されていません)。

どうやら、リクエストパラメータが階層化されているようで、この点に苦戦しています。
時間をかけて色々と試しましたが解決に辿り着けないため、力を貸して頂きたいと思い、
投稿させて頂きました。

APIのWSDLを「mzeep」で解析した結果

python -mzeep C:\test.wsdl ## 以下は、mzeep で解析された結果から関係する部分を抜粋したものです。 Global elements: ns1:MstRequest(ns1:MstRequest) Global types: ns1:ArrayOfcolum(colum: ns1:colum[]) ns1:ArrayOfcolumname(columname: ns1:columname[]) ns1:MstRequest(kigyocd: xsd:string, kigyopwd: xsd:string, mstname: xsd:string, columnames: ns1:ArrayOfcolumname, colums: ns1:ArrayOfcolum) ns1:colum(DATAValue: xsd:string) ns1:columname(FIELD: xsd:string) Bindings: Service: ShohinInfomation Operations: ShohinMstDataRq(kigyocd: xsd:string, kigyopwd: xsd:string, mstname: xsd:string, columnames: ns1:ArrayOfcolumname, colums: ns1:ArrayOfcolum) -> kigyocd: xsd:string, mstname: xsd:string, kbn: xsd:boolean, msg: xsd:string

リクエストプログラム

上で記載した解析結果を元に私が作成したリクエストのためのプログラムは、以下の通りです。

from zeep import Client from zeep.transports import Transport from requests.auth import HTTPBasicAuth from requests import Session # ローカルに保存しているWSDLファイルを読み込み WSDL = 'C:\test.wsdl' # SOAPクライアントを作成 client = Client(WSDL) # 項目定義を読み込み request_type = client.get_element('ns1:MstRequest') # 項目名称を定義 name = {} name['columname'] = {} name['columname']['FIELD']= ['KGYOUCD','SHOHINCD','BUNRUI','YUKOKBN'] # 項目名称に対する値を定義 data = {} data['colum'] = {} data['colum']['DATAValue']= ['TESTKIGYO','RD3000','0020','0'] # リクエストパラメータをセット request = request_type(kigyocd = 'TESTKIGYO' , kigyopwd = 'TESTPW' , mstname = 'SHMST', columnames = name , colums = data ) # リクエスト処理を実行 response = client.service.ShohinMstDataRq(request)

リクエストプログラムの実行結果

上に記載したプログラムを実行した結果、以下のエラーが表示されます。以下のエラーメッセージは、
最終行「response = client.service.ShohinMstDataRq(request)」実行後に出力されたものです。

raise ValueError( ValueError: The String type doesn't accept collections as value

エラー表示後に、変数「request」の値を確認するため、以下を実行。

>>> print(request) { 'kigyocd': 'TESTKIGYO', 'kigyopwd': 'TESTPW', 'mstname': 'SHMST', 'columnnames': { 'columnname': { 'FIELD': [ 'KGYOUCD', 'SHOHINCD', 'BUNRUI', 'YUKOKBN' ] } }, 'columns': { 'column': { 'DATAValue': [ 'TESTKIGYO', 'RD3000', '0020', '0' ] } } }

エラー表示後に、変数「request」の型を確認するため、以下を実行。

>>> type(request) <class 'zeep.objects.MstRequest'> >>>

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

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

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

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

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

guest

回答1

0

ベストアンサー

自分で試してみて確認してから回答するということができないので、手探りでの回答になるのはお許しいただきたいのですが…

以下ではどうでしょうか?

Python

1# (前略) 2 3client = Client(WSDL) 4 5request_type = client.get_element('ns1:MstRequest') 6 7name = {} 8name['columname'] = [] 9fields = ['KGYOUCD','SHOHINCD','BUNRUI','YUKOKBN'] 10for field in fields: 11 name['columname'].append( 12 {'FIELD': field} 13 ) 14 15data = {} 16data['colum'] = [] 17data_values = ['TESTKIGYO','RD3000','0020','0'] 18for data_value in data_values: 19 data['colum'].append( 20 {'DATAValue': data_value} 21 ) 22 23request = request_type( 24 kigyocd='TESTKIGYO', 25 kigyopwd='TESTPW', 26 mstname='SHMST', 27 columnames=name, 28 colums=data, 29) 30 31response = client.service.ShohinMstDataRq(request)

あと、こちらでの実行結果も教えていただきたいです。

Python

1# (前略) 2 3client = Client(WSDL) 4 5name = {} 6name['columname'] = [] 7fields = ['KGYOUCD','SHOHINCD','BUNRUI','YUKOKBN'] 8for field in fields: 9 name['columname'].append( 10 {'FIELD': field} 11 ) 12 13data = {} 14data['colum'] = [] 15data_values = ['TESTKIGYO','RD3000','0020','0'] 16for data_value in data_values: 17 data['colum'].append( 18 {'DATAValue': data_value} 19 ) 20 21request = { 22 kigyocd='TESTKIGYO', 23 kigyopwd='TESTPW', 24 mstname='SHMST', 25 columnames=name, 26 colums=data, 27} 28 29response = client.service.ShohinMstDataRq(**request)

投稿2021/05/17 04:34

etherbeg

総合スコア1195

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

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

PythonBegin

2021/05/17 09:05

ご回答、ありがとうございます。 試してみたところ、いずれの方法でも正常動作しました(正しくリクエストでき、正しいレスポンスが 返ってきました)!後者の方法では、最初、エラーが発生しましたが、「request 」の定義内容にある 「=」を「:」に変更し、左側の項目を「'」で囲むことで正常動作しました。 本当に助かりました。ありがとうございます!
etherbeg

2021/05/17 09:09

こちらこそ、試していただきありがとうございました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問