回答:
私は過去にさまざまなpython HTTPライブラリを使用したことがあり、お気に入りとして「リクエスト」に落ち着きました。既存のライブラリにはかなり使いやすいインターフェースがありましたが、コードが数行になりすぎて単純な操作には長すぎる場合があります。リクエストの基本的なPUTは次のようになります。
payload = {'username': 'bob', 'email': 'bob@bob.com'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
その後、次のようにして応答ステータスコードを確認できます。
r.status_code
または次の応答:
r.content
リクエストには、多くのシンタクティックシュガーとショートカットがあり、あなたの生活をより簡単にします。
json=payload
データを本文に含める場合は、parameterを使用します。
import urllib2
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = urllib2.Request('http://example.org', data='your_put_data')
request.add_header('Content-Type', 'your/contenttype')
request.get_method = lambda: 'PUT'
url = opener.open(request)
requests
代わりにライブラリの使用を検討してください。
Httplibはよりクリーンな選択のようです。
import httplib
connection = httplib.HTTPConnection('1.2.3.4:1234')
body_content = 'BODY CONTENT GOES HERE'
connection.request('PUT', '/url/path/to/put/to', body_content)
result = connection.getresponse()
# Now result.status and result.reason contains interesting stuff
httplibモジュールを見てください。それはあなたがあなたが望むどんな種類のHTTPリクエストも作ることができるはずです。
RESTful APIのクライアントとして機能できるように、この問題をしばらく前に解決する必要がありました。GETとPOSTに加えてPUTとDELETEを送信できるので、httplib2に決めました。Httplib2は標準ライブラリの一部ではありませんが、チーズショップから簡単に入手できます。
リクエストライブラリを使用できます。urllib2アプローチを使用する場合に比べて、多くのことが単純化されます。まず、pipからインストールします。
pip install requests
次にputリクエストを設定します。
import requests
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
# Create your header as required
headers = {"content-type": "application/json", "Authorization": "<auth-key>" }
r = requests.put(url, data=json.dumps(payload), headers=headers)
リクエストライブラリのクイックスタートをご覧ください。これはurllib2よりもはるかに簡単だと思いますが、この追加パッケージをインストールしてインポートする必要があります。
これはpython3で改善され、stdlibのドキュメントに記載されています
urllib.request.Request
クラスA獲得method=...
のpython3のパラメータを。
いくつかの使用例:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
私もお勧めしますhttplib2をジョーGregarioで。標準のlibでは、httplibの代わりにこれを定期的に使用しています。
もちろん、既存の標準ライブラリを使用して、ソケットからurllibの調整まで、あらゆるレベルで独自のライブラリをロールできます。
http://pycurl.sourceforge.net/
「PyCurlはlibcurlへのPythonインターフェースです。」
「libcurlは無料で使いやすいクライアント側のURL転送ライブラリで、...をサポートしています... HTTP PUT」
「PycURLの主な欠点は、Pythonクラスの階層がなく、libcurlに比べて比較的薄いレイヤーであることです。これは、libcurlのC APIに慣れていない限り、学習曲線がやや急になることを意味します。」
標準ライブラリ内にとどまりたい場合は、次のようにサブクラス化できますurllib2.Request
。
import urllib2
class RequestWithMethod(urllib2.Request):
def __init__(self, *args, **kwargs):
self._method = kwargs.pop('method', None)
urllib2.Request.__init__(self, *args, **kwargs)
def get_method(self):
return self._method if self._method else super(RequestWithMethod, self).get_method()
def put_request(url, data):
opener = urllib2.build_opener(urllib2.HTTPHandler)
request = RequestWithMethod(url, method='PUT', data=data)
return opener.open(request)
これを使用するより適切な方法はrequests
次のとおりです。
import requests
payload = {'username': 'bob', 'email': 'bob@bob.com'}
try:
response = requests.put(url="http://somedomain.org/endpoint", data=payload)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
raise
HTTP PUTリクエストにエラーがある場合、これにより例外が発生します。