13

Python でリクエストを使用してマルチパート/関連メッセージを送信しようとしています。スクリプトは、リクエストがマルチパート/フォームデータメッセージの送信のみを許可しているように見えることを除いて、十分に単純に見えますが、ドキュメントにはこれが何らかの方法で明確に記載されていません.

私のユースケースは、添付ファイル付きの石鹸を送信することです。内容がテスト SOAP メッセージである 2 つのファイルと、送信しようとしているテスト ドキュメントを含む辞書を提供できます。1 つ目はすべての指示を含む SOAP メッセージを含み、2 つ目は実際のドキュメントです。

ただし、ヘッダー値を指定しないと、ファイル オプションを使用する場合、リクエストは multipart/form-data のみを使用するように見えます。しかし、別のマルチパート タイプを指定しようとしてヘッダーを指定すると、リクエストは MIME 境界情報を追加しないようです。

url = 'http://10.10.10.90:8020/foo'
headers = {'content-type': 'multipart/related'}
files = {'submission': open('submission_set.xml', 'rb'), 'document': open('document.txt', 'rb')}
response = requests.post(url, data=data, headers=headers)
print response.text

リクエストを使用してこれを行う方法はありますか? または、私が見るべき別のツールはありますか?

4

2 に答える 2

25

MIME エンコーディングは自分で作成する必要があります。email.mimeパッケージでこれを行うことができます:

import requests
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

related = MIMEMultipart('related')

submission = MIMEText('text', 'xml', 'utf8')
submission.set_payload(open('submission_set.xml', 'rb').read())
related.attach(submission)

document = MIMEText('text', 'plain')
document.set_payload(open('document.txt', 'rb').read())
related.attach(document)

body = related.as_string().split('\n\n', 1)[1]
headers = dict(related.items())

r = requests.post(url, data=body, headers=headers)

XML ファイルは UTF-8 を使用していると思います。おそらく、documentエントリにも文字セットを設定する必要があります。

requestsmultipart/form-data投稿本文の作成方法しか知らない; はmultipart/related 一般的に使用されません。

于 2013-04-02T12:03:09.237 に答える