Set port in requests
Question:
I’m attempting to make use of cgminer
‘s API using Python. I’m particularly interested in utilizing the requests
library.
I understand how to do basic things in requests
, but cgminer
wants to be a little more specific. I’d like to shrink
import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 4028))
sock.send(json.dumps({'command': 'summary'}))
using requests
instead.
How does one specify the port using that library, and how does one send such a json request and await a response to be stored in a variable?
Answers:
You can specify the port for the request with a colon just as you would in a browser, such as
r = requests.get('http://localhost:4028')
. This will block until a response is received, or until the request times out, so you don’t need to worry about awaiting a response.
You can send JSON data as a POST request using the requests.post
method with the data
parameter, such as
import json, requests
payload = {'command': 'summary'}
r = requests.post('http://localhost:4028', data=json.dumps(payload))
Accessing the response is then possible with r.text
or r.json()
.
Note that requests is an HTTP library – if it’s not HTTP that you want then I don’t believe it’s possible to use requests.
As someone who has learned some of the common pitfalls of python networking the hard way, I’m adding this answer to emphasize an important-but-easy-to-mess-up point about the 1st arg of requests.get()
:
localhost
is an alias which your computer resolves to 127.0.0.1
, the IP address of its own loopback adapter. foo.com
is also an alias, just one that gets resolved further away from the host.
requests.get('foo.com:4028') #<--fails
requests.get('http://foo.com:4028') #<--works usually
& for loopbacks:
requests.get('http://127.0.0.1:4028') #<--works
requests.get('http://localhost:4028') #<--works
this one requires import socket
& gives you the local ip of your host (aka, your address within your own LAN); it goes a little farther out from the host than just calling localhost
, but not all the way out to the open-internet:
requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname()))) #<--works
I’m attempting to make use of cgminer
‘s API using Python. I’m particularly interested in utilizing the requests
library.
I understand how to do basic things in requests
, but cgminer
wants to be a little more specific. I’d like to shrink
import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 4028))
sock.send(json.dumps({'command': 'summary'}))
using requests
instead.
How does one specify the port using that library, and how does one send such a json request and await a response to be stored in a variable?
You can specify the port for the request with a colon just as you would in a browser, such as
r = requests.get('http://localhost:4028')
. This will block until a response is received, or until the request times out, so you don’t need to worry about awaiting a response.
You can send JSON data as a POST request using the requests.post
method with the data
parameter, such as
import json, requests
payload = {'command': 'summary'}
r = requests.post('http://localhost:4028', data=json.dumps(payload))
Accessing the response is then possible with r.text
or r.json()
.
Note that requests is an HTTP library – if it’s not HTTP that you want then I don’t believe it’s possible to use requests.
As someone who has learned some of the common pitfalls of python networking the hard way, I’m adding this answer to emphasize an important-but-easy-to-mess-up point about the 1st arg of requests.get()
:
localhost
is an alias which your computer resolves to 127.0.0.1
, the IP address of its own loopback adapter. foo.com
is also an alias, just one that gets resolved further away from the host.
requests.get('foo.com:4028') #<--fails
requests.get('http://foo.com:4028') #<--works usually
& for loopbacks:
requests.get('http://127.0.0.1:4028') #<--works
requests.get('http://localhost:4028') #<--works
this one requires import socket
& gives you the local ip of your host (aka, your address within your own LAN); it goes a little farther out from the host than just calling localhost
, but not all the way out to the open-internet:
requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname()))) #<--works