2010-11-23 23 views
0

Je veux faire un appel curl avec une URL qui a plusieurs paramètres. J'ai listé le code ci-dessous. Existe-t-il une option équivalente pour "curl -d @filter" par exemple ou ai-je l'URL encoder les paramètres?passer plusieurs paramètres pour l'URL en utilisant pycurl

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 
+0

Est-ce que vous essayez de faire une demande de publication? (vous mentionnez l'option -d) – cyraxjoe

Répondre

3

Le pycurl est un emballage très fin pour libcurl. Si vous pouvez le faire avec libcurl, vous pouvez le faire avec pycurl. (La plupart du temps.)

Par exemple:

pycurl.setopt correspond à curl_easy_setopt dans libcurl, où l'option est spécifiée avec le CURLOPT_ * constantes dans libcurl, sauf que le préfixe CURLOPT_ a été supprimé.

Voir: http://pycurl.sourceforge.net/doc/curlobject.html

Cela étant dit, l'option curl -d est pour l'envoi de requêtes HTTP POST ... pas le style GET votre exemple montre.

libcurl s'attend à ce que les URL qu'il recive soient déjà codées en URL. Utilisez simplement http://docs.python.org/library/urllib.html si nécessaire.

L'exemple d'URL de votre question comporte déjà 2 paramètres (userId et page).

En général, le format est: URL suivi d'un «point d'interrogation», suivi de paires nom = valeur jointes par un symbole d'esperluette. Si le nom ou la valeur contient des caractères spéciaux, vous devrez les encoder en pourcentage.

Il suffit d'utiliser la fonction 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 
>>> 

Aussi, voir la fonction urllib.urlopen. Peut-être que vous n'avez pas besoin de boucle du tout? (Mais je ne connais pas votre application ...)

Espérons que cela aide. Si oui, cochez la case et faites-le moi savoir. :-)

+0

Merci pour info nonot1 mais je cherche un moyen d'inclure plusieurs paramètres dans l'URL. Je suppose que je fais mal dans l'URL, mais je ne sais pas comment y remédier. – calmcajun

+0

@coolcajun Voir la mise à jour – nonot1