在请求中设置端口

Posted

技术标签:

【中文标题】在请求中设置端口【英文标题】:Set port in requests 【发布时间】:2014-10-24 07:51:10 【问题描述】:

我正在尝试使用 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 请求并等待将响应存储在变量中?

【问题讨论】:

我不确定。这就是我发表评论的原因:Request 是一个 HTTP 库。您可以在 URL http://example.com:4028/... 中指定端口。从我可以快速阅读的内容来看,herecgminer 提供了一个 RPC API。但是它提供了 HTTP 接口吗? 也许这就是问题所在。感谢您的帮助。 我已重新发布作为答案,因为您似乎证实了我的假设。 【参考方案1】:

Request 是一个 HTTP 库。

您可以在 URL 中指定端口http://example.com:4028/....

但是,从我匆忙阅读的内容来看,herecgminer 提供了RPC API(或JSON RPC?)不是HTTP 接口。

【讨论】:

【参考方案2】:

作为一个以艰难的方式学习了一些 python 网络常见陷阱的人,我添加这个答案是为了强调关于 @ 的 第一个参数的一个重要但容易搞砸的点987654322@

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

【讨论】:

172.0.0.1localhost 不正确。这是127.0.0.1。错字,或者这就是它失败的原因? 这确实是它失败的原因。 三斜杠是什么意思?文档中的在哪里? ///我尝试谷歌搜索但没有找到任何东西 哦哇哦有趣。这是一个错字&这在 python 中失败了(至少从 3.6 开始),但是一些浏览器(在 Firefox 上测试)似乎可以纠正这个问题。从技术上讲 http:///&lt;anything&gt; wouldn't be a valid URI, 所以理论上无论您首先遇到的 URI 解析...事物/系统都应该对您生气或尝试纠正格式错误的请求。无论如何:nslookup 返回“&lt;nameserver&gt; cannot find https:///google.com”,python 抛出错误,Firefox 会为您更正 URL。【参考方案3】:

您可以像在浏览器中一样使用冒号指定请求的端口,例如 r = requests.get('http://localhost:4028')。这将一直阻塞,直到收到响应或请求超时,因此您无需担心等待响应。

您可以使用requests.post method with the data parameter将JSON数据作为POST请求发送,例如

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

然后可以使用r.textr.json() 访问响应。

请注意,requests 是一个 HTTP 库 - 如果您想要的不是 HTTP,那么我认为不可能使用 requests。

【讨论】:

以上是关于在请求中设置端口的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-cloud-gateway 合约测试中从 spring-cloud-contract 中设置带有 StubRunner 端口的 url

如何在c中设置UDP套接字中的源端口?

如何在 Spring Boot 中设置 ActiveMQ 端口?

如何在CentOS7中的firewalld中设置放行20端口

TFS2015 Powershell on Target Machine - 在发布过程中设置变量/在远程服务器上查找空闲端口

如何设置 Varnish 在端口 80 上运行。/etc/default/varnish 中设置的 DAEMON_OPTS 故障