【问题标题】: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 接口吗?
  • 也许这就是问题所在。感谢您的帮助。
  • 我已重新发布作为答案,因为您似乎证实了我的假设。

标签: python networking python-3.x python-requests


【解决方案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。

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多