Requests module私は私たちの内部プロジェクトの1つについて作成したAPIをテストするのに驚くほど使い果たしています。 私は、Requestsモジュール自体の欠陥であるか、それを使用する上での欠陥であるかを発見したと思います。PythonリクエストモジュールとJSONレスポンス
Googleのデータは超高感度ではないため、APIは単純で基本的なHTTP認証を使用してアクセスを制御します。 JSONをデータフォーマットとして使用してurllib2とHTTPBasicAuthHandlerまたはPHPとcURLを使用してAPI URLをリクエストすると、正しくフォーマットされたJSON文字列としてデータが返されます。問題ありません。
しかし、リクエストモジュールを使用して同じリクエストを行うと、エンコードされた文字列が返され、エンコードの種類を判別できません。ここでは、その文字列の先頭の抜粋です:
ここ\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xadZ\xfb\x8f\xd3H\x12\xfeWzG\xab;\x90
が、私はこの問題を再現するための要求を使用しています数行のコードです:
import requests
# api_user and api_pw not printed here for security reasons
r = requests.get('http://ourdomain.com/api/featured/school/json', auth=(api_user, api_pw))
status = r.status_code # Produces 200 every time
rawdata = r.read()
print rawdata
そして、私はそのエンコードされた文字列を毎回取得私がする。
誰も私を決定するのに役立ちます。 a)は何()私自身の啓発のためにあるのエンコード、および b)はなぜリクエストは、そのエンコーディングでデータを返して、そしてどのようにデコードおよび/またはそれを「修正」します。
ありがとうございます!
これは興味深いことです!私はその方法を見ていませんでした:dir(r) JSON文字列を出力します。それはread()の代わりに呼び出されるべきメソッドですか? – tommytwoeyes
私は、それがライブラリの最後でどのように悪用されるのかを見ることができます(つまり、r.read()の代わりにr.contentを呼び出す必要があります)が、出力が異なる理由を説明していません私の開発仮想マシン(他のすべての要素は同じですが、r.read()を呼び出すときにJSON文字列を出力します)と、コード化された文字列を出力するプロダクションボックスを出力します。 出力が異なる理由は何ですか? – tommytwoeyes
@waveslider私の見ているもののリストにある以外のリクエストについてはわかりませんが、私はそれがデフォルトのエンコーディングと関係していると思います。あなたのdevボックスはおそらくUTF-8(すべてのJSONとする予定です)であり、サーバーは別のものです。私は '.content'プロパティがすべてのエンコーディングヘッダなどを見て、それらを適用していると推測していますが、' .read() 'は単にバイトをワイヤから引っ張っているだけで、エンコーディングが違うので、 。繰り返しますが、そのすべてはちょうど推測です。 –