Передача нескольких параметров для URL с помощью Pycurl - PullRequest
0 голосов
/ 23 ноября 2010

Я хочу сделать вызов 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 голосов
/ 23 ноября 2010

Pycurl - довольно тонкая оболочка для libcurl.Если вы можете сделать это с помощью libcurl, вы можете сделать это с помощью pycurl.(В основном.)

Например:

pycurl.setopt соответствует curl_easy_setopt в libcurl, где опция указана с помощью констант CURLOPT_ * в libcurl, за исключением того, что префикс CURLOPT_ был заданудалено.

См .: http://pycurl.sourceforge.net/doc/curlobject.html

При этом опция curl -d предназначена для отправки HTTP-запросов POST ... а не стиль GET, как показывает ваш пример.

libcurl ожидает, что URL-адреса, которые он получает, уже будут закодированы в URL.Просто используйте http://docs.python.org/library/urllib.html, если необходимо.

Пример URL в вашем вопросе уже имеет 2 параметра (userId и page).

Обычно формат имеет вид: URL, за которым следует «вопросительный знак», за которым следуют пары имя = значение, соединенные символом амперсанда.Если имя или значение содержат специальные символы, вам потребуется их процентное кодирование.

Просто используйте функцию 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.Возможно, вам не нужен скручивание вообще?(Но я не знаю ваше заявление ...)

Надеюсь, это поможет. Если так, отметьте ответ и дайте мне знать.: -)

...