2010-11-16 17 views
6

Bir POST tekniği kullanarak bir web API'sine erişmeye çalışıyorum. Bir GET tekniği kullanarak erişebiliyorum, ancak API sahipleri bana bazı işlevlerin yalnızca POST ile çalıştığını söylüyor. Maalesef POST çalışmasını göremiyorum.Web API'sine erişmek için POST ve urllib2 kullanma API

Burada GET ile çalışır budur:

API_URL = "http://example.com/api/" 

def call_api(method, **kwargs): 
    url = API_URL + method 
    if kwargs: 
     url += '?' + urllib.urlencode(kwargs) 
    req = urllib2.Request(url) 
    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 
    return urllib2.urlopen(req) 

İşte POST ile değil iş ne (HTTP 400 hatası neden olur):

API_URL = "http://example.com/api/" 

def call_api(method, **kwargs): 
    url = API_URL + method 
    data='' 
    if kwargs: 
     data=urllib.urlencode(kwargs) 
    req = urllib2.Request(url, data) 
    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 
    return urllib2.urlopen(req) 

mu şey de doğal olarak yanlış olarak herkes dışarı atlamak POST kodu? Daha önce hiç bir POST araması yapmadım ama okuduğum her şey benim kodumun makul olduğunu gösteriyor gibi görünüyor. POST kullanıyorum eğer yetkilendirme için add_header şeyi yapmak için bazı farklı yolu var mı? urllib2 ile

+1

POST kodunuz, GET kodunuzla tamamen aynı gibi görünüyor. Yanlış bir şey kopyalayıp yapıştırdınız mı? –

+0

Doh! Evet, bir yapıştırma hatası oluştu. Şimdi sabit. – neomech

cevap

9

Eğer POST vücuda veri eklemek gerekir:

def call_api(method, **kwargs): 
    url = API_URL + method 
    req = urllib2.Request(url) 

    if kwargs: 
     req.add_data(urllib.urlencode(kwargs)) 

    auth = 'Basic ' + base64.urlsafe_b64encode("%s:%s" % (USER, PASS)) 
    req.add_header('Authorization', auth) 

    # req.get_method() -> 'POST' 

    return urllib2.urlopen(req) 
+0

POST kodumu yapıştırmadığım sorusuyla ilgili bir hata yaşadım, ancak artık burada sahip olduğunuzla neredeyse aynı olduğunu görebiliyorsunuz. Ben gidip problemin API ile ve benim kodumla değil ne beklediği ile ilgili olduğunu varsayacağım. – neomech

2

@sneeu yukarıda belirttiği gibi, bir GET isteğini dönüştürür istek gönderilecek veri ekleme hareketidir bir POST içine. Bununla birlikte, bu yine de, POST gövdesinde API'nın almayı beklediğinin form kodlanmış veriler olduğunu varsayar. Çalıştığım daha birçok yeni API, orada başka bir şey bekliyor (en sık XML veya JSON).

Bu API'nın veri yükü olarak almayı beklediğini doğrulayabilir misiniz? Aynı sorun ile karşı karşıya kaldılar

+0

Şimdiye kadar gördüğüm koda dayanarak, haklı olduğunuzu düşünüyorum ... hata, API'nin yayınlamaya çalıştığım her şeyi beklememesinin bir sonucudur. – neomech

1

, ben HTTP POST yöntemi ile veri göndermek istiyorum, ama dir(req) sonra get_method, ancak hiçbir set_method buldum ve ayrıca data denilen bir özellik vardır bulundu, bu yüzden bu deneyin:

>>> req.data={"todototry":"123456"} 
>>> req.get_method() 
'POST' 
>>> 

Teşekkürler @sneeu.

İlgili konular