2011-06-10 17 views
7

मैं वर्तमान में कोड के एक टुकड़े के साथ काम कर रहा हूं जिसे किसी और ने लिखा है। सर्वर पर अनुरोध करने के लिए यह httplib का उपयोग करता है। इसमें एक सही प्रारूप में प्रदान किया गया सभी डेटा है - उदाहरण के लिए संदेश निकाय, हेडर वैल्यू इत्यादि।पायथन हॉस्पिटलप्लिब और पोस्ट

समस्या यह है कि हर बार जब यह POST अनुरोध भेजने का प्रयास करता है, तो डेटा वहां होता है - मैं इसे देख सकता हूं ग्राहक पक्ष, हालांकि सर्वर के लिए कुछ भी नहीं आता है। मैंने पुस्तकालय विनिर्देश के माध्यम से पढ़ा है और उपयोग सही लगता है।

निकाले पुस्तकालय कॉल जाना इस प्रकार है:

import httplib 

conn = httplib.HTTPConnection('monkeylabs.pl', 80) 
conn.connect() 
request = conn.putrequest('POST', '/api/snippet/') 
headers = {} 
headers['Content-Type'] = 'application/json' 
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03' 
headers['Accept'] = '*/*' 
for k in headers: 
    conn.putheader(k, headers[k]) 
conn.endheaders() 

conn.send('[{"id":"route"}]') 

resp = conn.getresponse() 
print resp.status 
print resp.reason 
print resp.read() 

conn.close() 

यह कुछ ज्ञात समस्या है, या क्या है? मैं पायथन 2.7 का उपयोग कर रहा हूँ। Sureplib के संस्करण की जांच कैसे करें सुनिश्चित नहीं है।

कृपया किसी अन्य चीज़ के लिए fansplib का आदान-प्रदान करने का सुझाव न दें जब तक कि यह वास्तव में कुछ समान नहीं है (httplib2 शायद)। जैसा कि मैंने कहा, कोड मेरा नहीं है और यह अभी ऊपर पोस्ट किए गए कार्यों की तुलना में बहुत अधिक मात्रा में आता है। इसे पुन: सक्रिय करने से एक बड़ी समस्या होगी। मुझे किसी भी विश्वसनीय कामकाज में दिलचस्पी है।

संपादित

डिबग आउटपुट:

send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]' 
reply: 'HTTP/1.0 201 CREATED\r\n' 
header: Date: Fri, 10 Jun 2011 23:54:00 GMT 
header: Server: WSGIServer/0.1 Python/2.7.1+ 
header: Vary: Cookie 
header: Content-Type: application/json 
header: Content-Length: 0 
201 
CREATED 

ध्यान दें कि उत्तर वास्तव में सर्वर जबाब, नहीं अनुरोध ही है, जो इस मामले में रिक्त है के बारे में बातचीत के बाद जानकारी।

[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0 

और उन तीन लाइनों:

से बाहर
`` 
<QueryDict: {}> 
<QueryDict: {}> 

:

print '`%s`' % request.raw_post_data 
print request.GET 
print request.POST 

पर प्राथमिक कारण है कि अनुरोध शरीर में ही खाली हो गया है मैं एक लॉग हो रही द्वारा निरीक्षण कर सकते है Django सर्वर। तो ऐसा लगता है कि यह शरीर भेजने का प्रयास करता है लेकिन इसे अंत में नहीं भेजता है।

संपादित करें (2)

ठीक है, मैं एक डंप ले लिया और यह वास्तव में मुझे बताया संदेश ब्राउज़र से भेजा में एक अतिरिक्त पैरामीटर 'सामग्री-लंबाई' कहा जाता है, जिसमें हटा दिया गया है है कि वहाँ पुस्तकालय का नियमित उपयोग। मुझे मूर्ख।

+2

, अगर आपको लगता है कि आप इस बात में बहुत कुछ डिबगिंग हो जाएगा, (स्थापित [Wireshark] http://www.wireshark.org/:

अपने कोड को यह जोड़े for पाश ऊपर) और तार पर वास्तव में क्या चल रहा है पर जासूसी करने के लिए इसका इस्तेमाल करें। – Darien

+0

धन्यवाद, मैं शुरुआत में एक गैर-आस्तिक था लेकिन वास्तव में मुझे समाधान के लिए प्रेरित किया। धन्यवाद फिर से – julkiewicz

+0

सर्वर में है: response.set_header ('एक्सेस-कंट्रोल-अनुमति-उत्पत्ति', '*') ???? –

उत्तर

5

कोशिश जोड़ने:

conn.set_debuglevel(1) 
अपने कोड में

ताकि आप देख सकते हैं कि वास्तव में क्या हो रहा है।

0

क्या आपने प्रेजेंटप्लिब दस्तावेज़ों की जांच की है? httplib एक मानक अजगर पुस्तकालय है, और अजगर ऑनलाइन प्रलेखन होने के बारे में भी बहुत अच्छा है: http://docs.python.org/library/httplib.html

उस पृष्ठ से उदाहरण:

>>> import httplib, urllib 
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) 
>>> headers = {"Content-type": "application/x-www-form-urlencoded", 
...   "Accept": "text/plain"} 
>>> conn = httplib.HTTPConnection("musi-cal.mojam.com:80") 
>>> conn.request("POST", "/cgi-bin/query", params, headers) 
>>> response = conn.getresponse() 
>>> print response.status, response.reason 
200 OK 
>>> data = response.read() 
>>> conn.close() 

आपका उदाहरण इससे ज्यादा काम प्रतीत होता है, और यदि आप पढ़ एपीआई प्रलेखन - उदाहरण के लिए putrequest - आप देखेंगे कि आप इसे अपने नमूने में गलत उपयोग कर रहे हैं। विशेष रूप से, यह स्वचालित रूप से डिफ़ॉल्ट रूप से स्वीकृति शीर्षलेख जोड़ता है।

अपने कोड को कार्यात्मक उदाहरण की तरह अधिक बनाने का प्रयास करें, अपने कोड दोनों में उपयोग की जाने वाली कॉल को समझने का प्रयास करें और कामकाजी उदाहरण में उपयोग करें।

+1

हां, मैंने एपीआई दस्तावेज पढ़ा और सब कुछ ठीक लगता है। समस्या यह है कि यह ठीक नहीं है। एक ही अनुरोध विभिन्न माध्यमों से किया गया - एक ब्राउज़र या दूसरी लाइब्रेरी अच्छी तरह से काम करता है। 'स्वीकार करें' हेडर को हटाने से कुछ भी नहीं बदलेगा। उदाहरण है कि आप एपीआई से चिपकाए गए प्रतिलिपि सिर्फ कुछ अलग कर रहे हैं। यह कोई पोस्ट नहीं है और यह संदेश निकाय अपलोड करने का प्रयास नहीं करता है। – julkiewicz

6

putrequest विधि स्वचालित रूप से सामग्री लंबाई शीर्षलेख नहीं जोड़ती है, आपको इसे स्वयं करने की आवश्यकता है या request विधि का उपयोग करना है। BTW

headers['Content-Length'] = "%d"%(len('[{"id":"route"}]')) 

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

  • कोई संबंधित समस्या नहीं^_^