2012-03-02 14 views
14

मैं फेसबुक ग्राफ एपीआई के माध्यम से GET और POST अनुरोध करने के लिए urllib2.urlopen का उपयोग करने का प्रयास कर रहा हूं। मैंने यहां से देखा: https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django कि मैं जीईटी अनुरोध को काफी आसानी से कर सकता हूं।डेटा तर्क के बिना POST अनुरोध करने के लिए urllib2.urlopen का उपयोग कैसे करें

और यहां से: How to send a POST request using django? और पायथन डॉक्स http://docs.python.org/library/urllib2.html ऐसा लगता है कि इसे POST अनुरोध करने के लिए डेटा पैराम की आवश्यकता है।

लेकिन फेसबुक के एपीआई को देख: http://developers.facebook.com/docs/reference/api/event/#invited इसे करने के लिए एक HTTP POST जारी करके

आपको एक ईवेंट में उपयोगकर्ताओं को आमंत्रित कर सकते हैं कहते हैं /EVENT_ID/आमंत्रित/USER_ID

मुझे यकीन है कि नहीं कर रहा हूँ मैं urlopen के साथ ऐसा कैसे कर सकता था, क्योंकि इस यूआरएल को खोलने के बाद से केवल यह जांचने जा रहा है कि उपयोगकर्ता को आमंत्रित किया गया है, जैसा कि एपीआई पेज पर बताया गया है:

आप से देख सकते हैं कि किसी विशिष्ट उपयोगकर्ता एक घटना के लिए आमंत्रित किया गया है जारी करने के एक HTTP/EVENT_ID/आमंत्रित/USER_ID को मिलता है:

इनपुट की सराहना।

उत्तर

0

मुझे लगता है कि आप काफी अपने स्वयं के प्रश्न का उत्तर दिया, तो आप सिर्फ अति-सोच यह हो ...

  • एक उपयोगकर्ता मुद्दा urlopen

  • के साथ एक पोस्ट को आमंत्रित करने के जांच करने के लिए यदि किसी उपयोगकर्ता को आमंत्रित किया गया है, तो urlopen के साथ एक GET जारी करें।

दोनों मामलों में, आप एक ही यूआरएल के साथ संवाद कर रहे हैं, अंतर प्राप्त या पोस्ट है।

आप एक प्राप्त और urlopen के साथ एक पोस्ट के बीच अंतर की अनिश्चित हैं, इस दस्तावेज़ पढ़ें:

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

+0

उत्तर के लिए धन्यवाद, मुझे अंतर के बारे में पता है। लेकिन चूंकि urlopen केवल डेटा पैरामीटर की आपूर्ति के दौरान एक POST अनुरोध भेजता है, इसलिए मुझे नहीं पता था कि मेरे पास कोई पैरामीटर नहीं है (http://developers.facebook.com/docs/reference/api/ में कुछ है बिना तर्क के POST कार्यों के मामले) – airfang

+0

ताकि डेटा का उपयोग न करें, बस यूआरएल में पैरामीटर की आपूर्ति करें। –

34

ऐसा लगता है कि आप एक खाली पोस्ट अनुरोध भेजना चाहते हैं, यहां तक ​​कि urllib2.urlopen हालांकि() जब आप डेटा पैरामीटर निर्दिष्ट करते हैं तो केवल एक पोस्ट भेजता है।

ऐसा लगता है आप डेटा सेट करता है, तो यह वास्तव में एक खाली पोस्ट भेजता है जैसे = "", और केवल अनुरोध प्राप्त जब डेटा = कोई नहीं:

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 - 

आशा है कि मदद करता है। मुझे छोटे HTTP सर्वर से प्रतिक्रिया प्रिंटआउट मिला है, उनके पास उनके लिए एक उदाहरण है: http://docs.python.org/library/simplehttpserver.html

+0

बिल्कुल वही जो मैं खोज रहा था! आपका बहुत बहुत धन्यवाद! – airfang

2

एक खाली पोस्ट भेजने का एक और तरीका है अनुरोध प्राप्त करना और get_method को ओवरराइड करना। यह इस मामले में अधिक काम है, लेकिन अन्य मामलों में क्लीनर हो सकता है (यदि आपके पास पहले से अनुरोध है, उदाहरण के लिए)।

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

get_method एक विधि है कि विधि रिटर्न प्रयोग की जाने वाली है, तो यहाँ हम एक लैम्ब्डा समारोह है कि 'POST' रिटर्न के साथ ओवरराइड है।

2

सीधे अजगर (urllib2) प्रलेखन

urllib2.urlopen से (यूआरएल [, डेटा] [, टाइमआउट]) ओपन यूआरएल यूआरएल, जो या तो एक स्ट्रिंग या एक अनुरोध वस्तु हो सकता है। चेतावनी HTTPS अनुरोध सर्वर के प्रमाणपत्र का कोई सत्यापन नहीं करते हैं। डेटा सर्वर को भेजने के लिए अतिरिक्त डेटा निर्दिष्ट करने वाला एक स्ट्रिंग हो सकता है, या कोई भी यदि कोई डेटा आवश्यक नहीं है। वर्तमान में HTTP अनुरोध केवल वे हैं जो डेटा का उपयोग करते हैं; डेटा पैरामीटर प्रदान किए जाने पर HTTP अनुरोध GET के बजाय POST होगा।

संबंधित मुद्दे