Установить порт в запросах

Я пытаюсь использовать API cgminer, используя Python. Мне особенно интересно использовать библиотеку 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 и ждать ответа, который будет храниться в переменной?

Ответ 1

Request - это HTTP-библиотека.

Вы можете указать порт в URL http://example.com:4028/....

Но, из того, что я могу читать в спешке здесь cgminer предоставляет RPC API ( или JSON RPC?) не интерфейс HTTP.

Ответ 2

Как человек, который на собственном опыте усвоил некоторые из распространенных ошибок в работе с питоном, я добавляю этот ответ, чтобы подчеркнуть важный, но несложный для запутывания пункт о первом аргументе request.get 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 вашего хоста (он же ваш адрес в вашей локальной сети); он идет немного дальше от хоста, чем просто вызывает localhost, но не до самого открытого интернета:

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

Ответ 3

Вы можете указать порт для запроса с двоеточием так же, как и в браузере, например 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, который вы хотите, я не считаю возможным использовать запросы.