[解決済み] Python Requestsを使ったSOAPリクエストの送信
2023-03-30 07:01:25
質問
Pythonの
requests
ライブラリを使って SOAP リクエストを送ることはできますか?
どのように解決するのですか?
確かに可能です。
plain requests lib を使って Weather SOAP Service を呼び出す例です。
import requests
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body><ns0:GetWeatherInformation/></ns1:Body>
</SOAP-ENV:Envelope>"""
response = requests.post(url,data=body,headers=headers)
print response.content
いくつかの注意事項。
-
ヘッダは重要です。ほとんどの SOAP リクエストは正しいヘッダがないと動作しません。
application/soap+xml
は、おそらくより 正しい ヘッダを使うべきでしょう (しかし、weatherservice はtext/xml
- これは、応答を xml の文字列として返します - その後、その xml をパースする必要があります。
- 簡単のために、私はリクエストをプレーンテキストとして含めました。しかし、ベストプラクティスはこれをテンプレートとして保存し、 jinja2 (例) を使ってロードし、変数も渡すことでしょう。
例えば
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()
何人かの人がsudsライブラリについて言及しています。Suds はおそらく、より 正しい の方法ですが、私はしばしば、WDSLがうまく形成されていないときに少しパニックになることを発見します(これは、TBH、まだSOAPを使用している機関と取引しているときに、そうでない場合よりも可能性が高いです ;) ).
sudsで上記のようなことができます。
from suds.client import Client
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
client = Client(url)
print client ## shows the details of this service
result = client.service.GetWeatherInformation()
print result
注意 を使用する場合、ほとんどの場合、最終的には ドクターを使う !
最後に、SOAPをデバッグするためのちょっとしたボーナスとして、TCPdumpはあなたの友人です。Macでは、このようにTCPdumpを実行できます。
sudo tcpdump -As 0
これは、実際にワイヤーを通過するリクエストを検査するのに便利です。
上記の2つのコードスニペットは、gistとしても利用可能です。
関連
-
[解決済み] ActionScript 3 で SOAP ウェブサービスに "Null" (本当の苗字!) を渡す方法
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] SOAPとRESTの比較(相違点)
-
[解決済み] Python RequestsでJSONデータをPOSTする方法とは?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] if 節の終了方法
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例