web-dev-qa-db-ja.com

リクエストにポートを設定する

Pythonを使用してcgminerのAPIを利用しようとしています。 requestsライブラリーの利用に特に興味があります。

requestsで基本的なことを行う方法は理解していますが、cgminerはもう少し具体的にしたいです。縮小したい

import socket
import json

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 4028))

sock.send(json.dumps({'command': 'summary'}))

代わりにrequestsを使用します。

そのライブラリを使用してポートを指定する方法、およびそのようなjson要求を送信し、変数に格納される応答を待機する方法を教えてください。

14
2mac

リクエスト はHTTPライブラリです。

URLでポートを指定できます http://example.com:4028/ ....

しかし、私は急いで読むことができるものから ここcgminer[〜#〜] rpc [〜#〜] API(または JSON RPC ?)notan [〜#〜] http [〜#〜] インターフェイス。

13
Sylvain Leroux

python難しい方法でネットワーク化するという一般的な落とし穴のいくつかを学んだ人として、私はこの答えを追加して、混乱についての重要だが簡単な点を強調しています- requests.get()の最初の引数

localhostは、コンピューターが127.0.0.1(独自のループバックアダプターのIPアドレス)に解決するエイリアスです。 foo.comもエイリアスであり、ホストからさらに離れて解決されるものです。

requests.get('foo.com:4028')                #<--fails
requests.get('http://foo.com:4028')         #<--works usually  

&ループバックの場合:

requests.get('http://127.0.0.1:4028')       #<--works
requests.get('http://localhost:4028')       #<--works

これにはimport socketが必要で、ホストのローカルIP(別名、独自のLAN内のアドレス)を提供します。ホストからlocalhostを呼び出すよりも少し遠くに行きますが、オープンインターネットに至るわけではありません。

requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname())))  #<--works
14
Rob Truxal

r = requests.get('http://localhost:4028')など、ブラウザーでの場合と同様に、コロンを使用して要求のポートを指定できます。これは、応答が受信されるまで、または要求がタイムアウトするまでブロックされるため、応答を待つことを心配する必要はありません。

JSONデータをPOSTリクエストとして _requests.post_メソッドとdataパラメーター を使用して送信できます。

_import json, requests
payload = {'command': 'summary'}
r = requests.post('http://localhost:4028', data=json.dumps(payload))
_

応答にアクセスするには、_r.text_またはr.json()を使用します。

リクエストはHTTPライブラリであることに注意してください-必要なHTTPではない場合、リクエストを使用することはできないと思います。

2
Kkelk