在请求中设置端口
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 库。您可以在 URLhttp://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.1
与 localhost
不正确。这是127.0.0.1
。错字,或者这就是它失败的原因?
这确实是它失败的原因。
三斜杠是什么意思?文档中的在哪里? ///
我尝试谷歌搜索但没有找到任何东西
哦哇哦有趣。这是一个错字&这在 python 中失败了(至少从 3.6 开始),但是一些浏览器(在 Firefox 上测试)似乎可以纠正这个问题。从技术上讲 http:///<anything>
wouldn't be a valid URI, 所以理论上无论您首先遇到的 URI 解析...事物/系统都应该对您生气或尝试纠正格式错误的请求。无论如何:nslookup
返回“<nameserver> 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.text
或r.json()
访问响应。
请注意,requests 是一个 HTTP 库 - 如果您想要的不是 HTTP,那么我认为不可能使用 requests。
【讨论】:
以上是关于在请求中设置端口的主要内容,如果未能解决你的问题,请参考以下文章
如何在 spring-cloud-gateway 合约测试中从 spring-cloud-contract 中设置带有 StubRunner 端口的 url
如何在 Spring Boot 中设置 ActiveMQ 端口?
如何在CentOS7中的firewalld中设置放行20端口
TFS2015 Powershell on Target Machine - 在发布过程中设置变量/在远程服务器上查找空闲端口
如何设置 Varnish 在端口 80 上运行。/etc/default/varnish 中设置的 DAEMON_OPTS 故障