2010-11-16 36 views
6

Tôi đang cố truy cập API web bằng kỹ thuật POST. Tôi có thể truy cập nó bằng cách sử dụng kỹ thuật GET, nhưng chủ sở hữu API cho tôi biết rằng một số chức năng nhất định chỉ hoạt động với POST. Thật không may tôi dường như không thể nhận được POST làm việc.Sử dụng POST và urllib2 để truy cập API web

Đây là những gì làm việc với GET:

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) 

Đây là những gì không làm việc với POST (gây HTTP 400 lỗi):

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) 

Liệu bất cứ điều gì nhảy ra ở bất cứ ai như là vốn đã không chính xác trong POST code? Tôi chưa bao giờ thực hiện một cuộc gọi POST trước đây nhưng mọi thứ tôi đã đọc dường như gợi ý rằng mã của tôi là hợp lý. Có một số cách khác nhau tôi phải làm điều add_header cho phép nếu tôi đang sử dụng POST?

+1

Mã POST của bạn dường như giống hệt mã GET của bạn. Bạn đã sao chép và dán một cái gì đó không chính xác? –

+0

Doh! Có, đã xảy ra lỗi khi dán. Đã sửa lỗi. – neomech

Trả lời

9

Với urllib2 bạn cần phải thêm dữ liệu vào cơ thể POST:

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

Tôi gặp lỗi trong câu hỏi của mình, nơi tôi không dán mã POST của mình, nhưng bây giờ bạn có thể thấy nó gần giống với những gì bạn có ở đây. Tôi sẽ chỉ đi và giả định rằng vấn đề liên quan đến API và những gì nó mong đợi, và không phải với mã của tôi. – neomech

2

Như @sneeu lưu ý ở trên, đó là hành động của việc thêm các dữ liệu được gửi đến các yêu cầu có thể chuyển đổi các yêu cầu từ GET vào POST.

Tuy nhiên, điều này vẫn giả định rằng những gì API dự kiến ​​nhận được trong cơ thể POST là dữ liệu được mã hóa biểu mẫu. Nhiều API gần đây hơn mà tôi đã làm việc cùng đang mong đợi một thứ khác trong đó (XML hoặc JSON, phổ biến nhất).

Bạn có thể xác minh xem API đó sẽ nhận được gì dưới dạng tải trọng dữ liệu không?

+0

Dựa trên mã tôi đã thấy cho đến nay, tôi nghĩ rằng bạn đang phải ... lỗi là kết quả của API không mong đợi bất cứ điều gì tôi đang cố gắng đăng. – neomech

1

tôi đã phải đối mặt với cùng một vấn đề, tôi muốn gửi dữ liệu với phương thức POST của HTTP, nhưng sau khi dir(req) tôi thấy get_method, nhưng không có set_method, và tôi cũng tìm thấy ở đó là một tính chất gọi data, vì vậy hãy thử này ra:

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

Cảm ơn @sneeu.

Các vấn đề liên quan