2010-07-20 18 views
66

कोई भी ट्यूटोरियल इंगित कर सकता है जो मुझे दिखाता है कि JSON प्रारूप में डेटा के साथ urllib2 का उपयोग करके POST अनुरोध कैसे करें?urllib2 और json

उत्तर

16

उदाहरण - भेजने कुछ डेटा एक पोस्ट डेटा के रूप में JSON के रूप में इनकोडिंग:

import json 
import urllib2 
data = json.dumps([1, 2, 3]) 
f = urllib2.urlopen(url, data) 
response = f.read() 
f.close() 
+3

कई प्रणालियों के लिए यह काम नहीं करेगा। नीचे बॉब वान ज़ेंट का जवाब देखें। – speedplane

2

आप निश्चित रूप से एक उचित अजाक्स अनुरोध करने के लिए शीर्ष लेख को हैक करना चाहते हैं:

headers = {'X_REQUESTED_WITH' :'XMLHttpRequest', 
      'ACCEPT': 'application/json, text/javascript, */*; q=0.01',} 
request = urllib2.Request(path, data, headers) 
response = urllib2.urlopen(request).read() 

और json.loads को सर्वर-पक्ष पर पोस्ट।

संपादित करें: वैसे, आपको urllib.urlencode(mydata_dict) उन्हें भेजने से पहले होना चाहिए। यदि आप नहीं करते हैं, तो POST वह नहीं होगा जो सर्वर

+0

urlencode यूआरएल प्रारूप में एन्कोडेड डेटा भेज देगा, जेसन में नहीं। – kolinko

124

मेसा का उत्तर केवल तभी काम करता है जब सर्वर सामग्री-प्रकार शीर्षलेख की जांच करने के लिए परेशान नहीं है। यदि आप वास्तव में काम करना चाहते हैं तो आपको एक सामग्री-प्रकार शीर्षलेख निर्दिष्ट करना होगा। यहाँ Messa के जवाब सामग्री-प्रकार शीर्ष लेख शामिल करने के लिए संशोधित है:

import json 
import urllib2 
data = json.dumps([1, 2, 3]) 
req = urllib2.Request(url, data, {'Content-Type': 'application/json'}) 
f = urllib2.urlopen(req) 
response = f.read() 
f.close() 
+1

पायथन 3 और urllib के साथ काम करते हुए, अतिरिक्त रूप से मुझे यह काम करने वाला 'डेटा = json.dumps ([1, 2, 3]) प्राप्त करने के लिए अपने जेसन पार्स किए गए डेटा को एन्कोड करना पड़ा। एनकोड ("utf8)'। Http: // देखें stackoverflow.com/a/5441022/3757139 – Samuel

30

जो भी urllib सामग्री-लंबाई यह पता लगाने की उपयोग कर रहा है json से उलझन में मिल रहा है, तो आप की गणना करने के अपने आप को कि है।

import json 
import urllib2 
data = json.dumps([1, 2, 3]) 
clen = len(data) 
req = urllib2.Request(url, data, {'Content-Type': 'application/json', 'Content-Length': clen}) 
f = urllib2.urlopen(req) 
response = f.read() 
f.close() 

मुझे यह पता लगाने के लिए हमेशा के लिए ले लिया, इसलिए मुझे उम्मीद है कि यह किसी और की मदद करेगा।

+1

इसके लिए आपको बहुत कुछ धन्यवाद !! 5 साल बाद और यह अभी भी टूटा हुआ है !! – GuyMatz

+1

मैं सत्यापित कर सकता हूं कि पुराने पायथन में कम से कम (विशेष रूप से 2.6) कुछ भी काम नहीं करेगा जब तक कि आप सामग्री- इस उत्तर में लंबाई! – Wingware

6

जेसन प्रतिक्रिया पढ़ने के लिए json.loads() पढ़ें। नमूना यहाँ है।

import json 
import urllib 
import urllib2 

post_params = { 
    'foo' : bar 
} 

params = urllib.urlencode(post_params) 
response = urllib2.urlopen(url, params) 
json_response = json.loads(response.read()) 
+1

यह JSON नहीं भेजता है, इसे केवल प्राप्त करता है। – tsturzl

1

यह वही मेरे लिए काम किया है:

import json 
import requests 
url = 'http://xxx.com' 
payload = {'param': '1', 'data': '2', 'field': '4'} 
headers = {'content-type': 'application/json'} 
r = requests.post(url, data = json.dumps(payload), headers = headers) 
+6

मुझे नहीं लगता कि अनुरोध पैकेज मानक लाइब्रेरी का हिस्सा है। –

+0

हालांकि 'अनुरोध' पैकेज मानक lib का हिस्सा नहीं है, यह आसानी से पाइप का उपयोग कर स्थापित किया जाता है। उन लोगों के लिए बिल्कुल सही जो वर्चुअल वातावरण में काम कर रहे हैं। – Will