首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Curl将请求发送到pycurl代码

Curl将请求发送到pycurl代码
EN

Stack Overflow用户
提问于 2015-08-05 08:07:32
回答 5查看 51.4K关注 0票数 14

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

代码语言:javascript
运行
复制
curl -v
-H Accept:application/json \
-H Content-Type:application/json \
-d "{
    name: 'abc',
    path: 'def',
    target: [ 'ghi' ]
}" \
-X POST http://some-url

我有以下python代码:

代码语言:javascript
运行
复制
import pycurl, json

c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://some-url')
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
data = json.dumps({"name": "abc", "path": "def", "target": "ghi"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
print curl_agent.getinfo(pycurl.RESPONSE_CODE)
c.close()

执行此操作时,出现了一个错误415:不支持的媒体类型,因此我更改了:

代码语言:javascript
运行
复制
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])

转入:

代码语言:javascript
运行
复制
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])

这一次我有400:糟糕的要求。但是带curl的bash代码可以工作。您知道我应该在python代码中修复什么吗?

EN

Stack Overflow用户

发布于 2019-12-06 04:18:10

PycURL是用C语言编写的libcurl库的包装器,因此它的Python可能有点令人费解。由于有些人提倡使用python请求,所以我只想指出,它不是一个完美的替代。对我来说,它缺乏DNS解析超时是一个交易的障碍。我也发现在我的覆盆子Pi上慢得多。这个比较可能是相关的:Python与PyCurl性能

所以,有件事不能回避OP的问题:

代码语言:javascript
运行
复制
import pycurl
import json
from cStringIO import StringIO

curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'http://some-url')
curl.setopt(pycurl.HTTPHEADER, ['Accept: application/json',
                                'Content-Type: application/json'])
curl.setopt(pycurl.POST, 1)

# If you want to set a total timeout, say, 3 seconds
curl.setopt(pycurl.TIMEOUT_MS, 3000)

## depending on whether you want to print details on stdout, uncomment either
# curl.setopt(pycurl.VERBOSE, 1) # to print entire request flow
## or
# curl.setopt(pycurl.WRITEFUNCTION, lambda x: None) # to keep stdout clean

# preparing body the way pycurl.READDATA wants it
# NOTE: you may reuse curl object setup at this point
#  if sending POST repeatedly to the url. It will reuse
#  the connection.
body_as_dict = {"name": "abc", "path": "def", "target": "ghi"}
body_as_json_string = json.dumps(body_as_dict) # dict to json
body_as_file_object = StringIO(body_as_json_string)

# prepare and send. See also: pycurl.READFUNCTION to pass function instead
curl.setopt(pycurl.READDATA, body_as_file_object) 
curl.setopt(pycurl.POSTFIELDSIZE, len(body_as_json_string))
curl.perform()

# you may want to check HTTP response code, e.g.
status_code = curl.getinfo(pycurl.RESPONSE_CODE)
if status_code != 200:
    print "Aww Snap :( Server returned HTTP status code {}".format(status_code)

# don't forget to release connection when finished
curl.close()

淫羊藿卷曲文档中有一些更有趣的特性值得检查

票数 13
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31826814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档