【问题标题】:Curl POST into pycurl code将 POST 卷曲成 pycurl 代码
【发布时间】:2016-03-14 15:48:14
【问题描述】:

我正在尝试将以下 curl 请求转换为 pycurl:

curl -v \
--user username:passwd \
-H X-Requested-By:MyClient \
-H Accept:application/json \
-X POST \
http://localhost:7001/some_context

而且它有效。以下不起作用:

import pycurl, json

url = "http://localhost:7001/some_context"
c = pycurl.Curl()
data = json.dumps(None)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json', 'X-Requested-By:MyClient'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()

但执行此操作时出现错误 415:不支持的媒体类型。你有什么主意吗?我宁愿继续使用 pycurl——我知道 requests 库...

【问题讨论】:

  • 我注意到在第一个示例中,您没有传递任何数据。在第二个中,您传递一个application/x-www-form-urlencoded 字符串。
  • 这是一个有用的技术:用http://httpbin.org/post 替换两个示例中的 URL 并检查详细输出。

标签: python curl pycurl


【解决方案1】:

此脚本模仿您的 curl 命令行,但 URL 除外。我已经替换了你的 URL,这样我们就可以测试同一个服务器。

import pycurl, json

url = "http://localhost:7001/some_url"
url= 'http://httpbin.org/post'
c = pycurl.Curl()
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDSIZE, 0)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json',
                             'X-Requested-By:MyClient',
                             'Content-Type:',
                             'Content-Length:'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()

【讨论】:

  • 我尝试编辑了两次,两次都被拒绝了。因此,让我们尝试发表评论。请从您的示例代码中删除对url 的第二个分配。它不是原始帖子的一部分,它使第一个分配(原始代码的一部分)毫无意义。这可能只是复制/粘贴过程中遗漏的东西。希望@avariant 和@Suraj Kumar 不要拒绝它...
  • 不,@Z4-tier 不是不小心错过的。有意包含它是为了将 OP 非工作样本转换为实际工作样本。也许我的意图不清楚,我应该添加评论。
  • 并不是说不清楚。相反,正如目前所写的那样,“此脚本模仿您的 curl 命令行:”语句是不正确的。很抱歉分叉,但主题是编程,程序正确性很重要。
  • 谢谢,@Z4-tier。我没有从您提议的编辑中了解到您的担忧。希望我最近的更改能解决您的问题。
【解决方案2】:

您的帖子数据是错误的,根据http://pycurl.io/docs/latest/quickstart.html#sending-form-data 它需要一个字典,而不是一个字符串。 (json.dumps(None) == 'null')

您从网络服务器收到的错误很可能与此有关。

import pycurl, json

url = "http://localhost:7001/some_url"
c = pycurl.Curl()
data = {'whatever_field': None}
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json', 'X-Requested-By:MyClient'])
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.USERPWD, "username:passwd")
c.perform()

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2017-05-10
    • 2019-11-02
    • 1970-01-01
    • 2015-09-09
    • 2019-02-25
    • 1970-01-01
    • 2012-01-21
    • 2016-08-12
    相关资源
    最近更新 更多