在请求中设置端口

32 投票
3 回答
135084 浏览
提问于 2025-04-18 23:17

我正在尝试用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请求并等待响应,把结果存到一个变量里呢?

3 个回答

3

你可以像在浏览器里一样,通过在请求的地址后面加上冒号来指定端口,比如说

r = requests.get('http://localhost:4028')。这个请求会一直等到收到响应,或者超时为止,所以你不用担心要等待响应。

如果你想发送JSON数据,可以使用requests.post方法,并加上data参数,比如说

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

然后你可以通过r.text或者r.json()来获取响应内容。

需要注意的是,requests是一个HTTP库,如果你要的不是HTTP的请求,那我觉得用requests是不行的。

27

作为一个在学习Python网络编程时遇到了一些常见问题的人,我想分享一个很重要但容易搞错的点,关于requests.get()的第一个参数

localhost是一个别名,你的电脑会把它解析成127.0.0.1,也就是它自己内部的地址。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
28

Request 是一个用于处理HTTP请求的库。

你可以在网址中指定端口,比如 http://example.com:4028/

不过,从我快速浏览的内容来看,这里提到的 cgminer 提供的是一个 RPC API(或者说是 JSON RPC?)而不是一个 HTTP 接口。

撰写回答