PythonでHTTP PUT
を使用してサーバーにデータをアップロードする必要があります。 urllib2ドキュメントの私の短い読みから、それはHTTP POST
のみを行います。 PythonでHTTP PUT
を実行する方法はありますか?
過去にさまざまなpython HTTPライブラリを使用しましたが、お気に入りとして ' Requests 'に決めました。既存のライブラリにはかなり使いやすいインターフェースがありましたが、単純な操作にはコードが数行長すぎる可能性があります。リクエストの基本的なPUTは次のようになります。
payload = {'username': 'bob', 'email': '[email protected]'}
>>> r = requests.put("http://somedomain.org/endpoint", data=payload)
その後、次のコマンドで応答ステータスコードを確認できます。
r.status_code
または以下の応答:
r.content
リクエストには、あなたの人生を楽にする、多くの相乗的な砂糖とショートカットがあります。
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)
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
要求ライブラリを使用できます。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よりもはるかに簡単ですが、この追加パッケージをインストールしてインポートする必要があります。
httplibモジュール をご覧ください。どんな種類のHTTPリクエストでも行うことができます。
これはpython3で改善され、 stdlibドキュメント に文書化されました。
urllib.request.Request
クラスは、python3でmethod=...
パラメーターを取得しました。
使用例:
req = urllib.request.Request('https://example.com/', data=b'DATA!', method='PUT')
urllib.request.urlopen(req)
RESTful APIのクライアントとして機能できるように、しばらく前にこの問題を解決する必要がありました。 GETとPOSTに加えてPUTとDELETEを送信できるため、httplib2に決めました。 Httplib2は標準ライブラリの一部ではありませんが、チーズショップから簡単に入手できます。
また、Joe Gregarioによる httplib2 もお勧めします。標準ライブラリでhttplibの代わりにこれを定期的に使用します。
put.py をご覧になりましたか?過去に使用しました。 urllibを使用して独自のリクエストをハックすることもできます。
標準ライブラリ内にとどまる場合は、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)
もちろん、ソケットからurllibの調整まで、あらゆるレベルで既存の標準ライブラリを使用して独自のロールを作成できます。
http://pycurl.sourceforge.net/
「PyCurlはPython libcurlへのインターフェースです。」
「libcurlは無料で使いやすいクライアント側のURL転送ライブラリです。..サポート... HTTP PUT」
「PycURLの主な欠点は、Nice Pythonのクラス階層を持たないlibcurl上の比較的薄い層です。これは、libcurlのC APIに慣れていない限り、学習曲線がやや急勾配であることを意味します。」