2016-05-27 10 views
1

リクエストモジュールを使用してWebサービスにリクエストを送信することに苦労しました。私はWindowsでPython 3.5.1〜32ビットを使用しています。Pythonがモジュールをリクエストし、ボディをエンコードする必要があります。なぜですか?

たとえば、 "á"のようなラテンのアクセント付き文字を要求すると、文字列変数をutf-8として明示的にエンコードする必要があります。なぜ私はこれを行う必要があるか誰かが説明できますか?ここで

は、私のコードの例である:これは動作しません

import requests 

headers = { "content-type" : "text/xml;charset=UTF-8" } 
url = '....' 
body = 'á' 
requests.post(url, data=body, headers=headers) 

、サーバーは、文字のエスケープバージョンを受信しますが、私は、要求前にこれを追加した場合:

body = body.encode(encoding='utf-8') 

それは、働く

これがなぜ必要なのか誰かが説明できますか?私のPython-Fuはこれを理解するのに良い時間を取ってくれました。

+0

実際は必要ありません。私はいつもstr()を送信し、bytes()は送信しません。 – Maresh

答えて

1

要求 DOCは言う:

:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. 

Pythonの3body='á'では、Unicode文字列です。メソッドencode()を使用すると、バイトに変換されます。ファイルの内容として、それを理解してオクテットストリーム/ BASE64でエンコード Unicode文字列、要求に対して

。偽のコンテンツが転送されます。

P/S:Python 3の場合のみです。 Python 2のstrは、Python 3のstrと似ていません。

+0

ありがとう、私はそれを理解しています。私は、unicode == utf-8 in python 3と仮定しました。 –

+0

私はまったく同じ問題を抱えています。 Python 2のためにどのように解決すればよいですか? – kev

+0

これはPython 2を意味するはずです。どのようにエラーがありますか? – qvpham

関連する問題