2012-03-02 20 views
14

Tôi đang cố gắng sử dụng urllib2.urlopen để thực hiện các yêu cầu GET và POST thông qua API biểu đồ Facebook. Tôi nhận thấy từ đây: https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django rằng tôi có thể thực hiện yêu cầu GET khá dễ dàng.Làm thế nào để sử dụng urllib2.urlopen để thực hiện yêu cầu POST mà không cần đối số dữ liệu

Và từ đây: How to send a POST request using django? và tài liệu Python http://docs.python.org/library/urllib2.html có vẻ như cần thông số dữ liệu để thực hiện yêu cầu POST.

Nhưng nhìn vào API của Facebook: http://developers.facebook.com/docs/reference/api/event/#invited nó nói

Bạn có thể mời người dùng một sự kiện bằng cách phát hành một HTTP POST để /EVENT_ID/mời/USER_ID

Tôi không chắc chắn cách tôi có thể làm điều đó với urlopen, vì việc mở url này trực tiếp sẽ chỉ kiểm tra xem người dùng đã được mời hay chưa, như đã đề cập trên trang API:

Bạn có thể kiểm tra xem một người dùng cụ thể đã được mời tham gia một sự kiện bởi phát hành một HTTP GET đến/EVENT_ID/mời/USER_ID:

Coi trọng đầu vào.

Trả lời

0

Tôi nghĩ rằng bạn đã khá nhiều đã trả lời câu hỏi của riêng bạn, bạn chỉ là quá nghĩ đến nó ...

  • Để mời một vấn đề người dùng một POST với urlopen

  • Để kiểm tra nếu người dùng đã được mời, hãy đưa ra GET với urlopen.

Trong cả hai trường hợp, bạn đang liên lạc với cùng một URL, sự khác biệt là GET hoặc POST.

Nếu bạn không chắc chắn về sự khác biệt giữa một GET và POST với urlopen, đọc tài liệu này:

http://www.doughellmann.com/PyMOTW/urllib2/

+0

Cảm ơn câu trả lời, tôi biết sự khác biệt. Nhưng vì urlopen chỉ gửi một yêu cầu POST khi tham số dữ liệu được cung cấp, tôi không biết phải làm gì nếu tôi không có bất kỳ tham số nào (http://developers.facebook.com/docs/reference/api/ có một số trường hợp có các hành động POST không có đối số) – airfang

+0

để GET không sử dụng dữ liệu, chỉ cần cung cấp các tham số trong URL. –

34

Có vẻ như bạn muốn gửi một yêu cầu POST trống rỗng, mặc dù urllib2.urlopen() chỉ gửi một bài đăng khi bạn chỉ định tham số dữ liệu.

Nó có vẻ như nó thực sự sẽ gửi một POST trống nếu bạn thiết lập dữ liệu = "", và chỉ GET yêu cầu khi dữ liệu = None:

urllib2.urlopen("http://127.0.0.1:8000", data="") 
"POST/HTTP/1.1" 501 - 

urllib2.urlopen("http://127.0.0.1:8000", data=None) 
"GET/HTTP/1.1" 200 - 

Hy vọng rằng sẽ giúp. Tôi nhận được bản in phản hồi từ máy chủ HTTP nhỏ mà họ có ví dụ tại đây: http://docs.python.org/library/simplehttpserver.html

+0

Chính xác những gì tôi đang tìm kiếm! Cảm ơn nhiều! – airfang

2

Một cách khác để gửi POST trống là tạo Yêu cầu và ghi đè get_method của nó. Đây là công việc nhiều hơn trong trường hợp này, nhưng có thể sạch hơn trong các trường hợp khác (nếu bạn đã có một Yêu cầu, ví dụ).

request = urllib2.Request(url) 
    request.get_method = lambda: 'POST' 
    urllib2.urlopen(request) 

get_method là phương thức trả về phương thức được sử dụng, do đó, chúng tôi ghi đè phương thức này bằng hàm lambda trả về 'POST'.

2

Trực tiếp từ Python (urllib2) Documentation

urllib2.urlopen (url [, dữ liệu] [, timeout]) Mở url URL, đó có thể là một chuỗi hoặc một đối tượng Request. Cảnh báo yêu cầu HTTPS không thực hiện bất kỳ xác minh chứng chỉ của máy chủ nào. dữ liệu có thể là một chuỗi chỉ định dữ liệu bổ sung để gửi tới máy chủ hoặc None nếu không có dữ liệu như vậy là cần thiết. Hiện tại các yêu cầu HTTP là những yêu cầu duy nhất sử dụng dữ liệu; yêu cầu HTTP sẽ là POST thay vì GET khi tham số dữ liệu được cung cấp.

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