使用pycurl传递多个URL参数

0 投票
1 回答
4134 浏览
提问于 2025-04-16 07:29

我想用curl命令调用一个包含多个参数的URL。我在下面列出了代码。请问有没有类似于“curl -d @filter”的选项,还是说我需要对参数进行URL编码呢?

SER = foobar
PASS = XXX

STREAM_URL = "http://status.dummy.com/status.json?userId=12&page=1"
class Client:   
          def __init__(self):
        self.buffer = ""
        self.conn = pycurl.Curl()
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (USER,PASS))
        self.conn.setopt(pycurl.URL, STREAM_URL)
        self.conn.setopt(pycurl.WRITEFUNCTION, self.on_receive)
        self.conn.perform()

    def on_receive(self,data):
        self.buffer += data

1 个回答

3

Pycurl 是一个对 libcurl 的简单封装。如果你能用 libcurl 完成的事情,基本上也能用 pycurl 来做。

举个例子:

pycurl.setopt 对应于 libcurl 中的 curl_easy_setopt,在 libcurl 中,选项是用 CURLOPT_* 常量来指定的,只不过 CURLOPT_ 前缀被去掉了。

详细信息可以查看:http://pycurl.sourceforge.net/doc/curlobject.html

需要注意的是,curl -d 选项是用来发送 HTTP POST 请求的……而不是你例子中展示的 GET 请求方式。

libcurl 期望接收到的 URL 已经是经过 URL 编码的。如果需要,可以使用 http://docs.python.org/library/urllib.html

你问题中的示例 URL 已经有两个参数(userId 和 page)。

一般来说,格式是:URL 后面跟一个“问号”,然后是用“&”符号连接的 name=value 对。如果名字或值中包含特殊字符,你需要对它们进行百分号编码。

可以使用 urlencode 函数来处理:

>>> import urllib
>>> params = [('name1','value1'), ('name2','value2 with spaces & stuff')]
>>> pairs = urllib.urlencode(params)
>>> fullurl = 'http://status.dummy.com/status.json' + '?' + pairs
>>> print fullurl
http://status.dummy.com/status.json?name1=value1&name2=value2+with+spaces+%26+stuff
>>> 

另外,看看 urllib.urlopen 函数。也许你根本不需要使用 curl?(但我不知道你的具体应用……)

希望这些对你有帮助。 如果有帮助,请标记为已解决,并告诉我。 :-)

撰写回答