2012-03-17 22 views
76
data = { 
     'ids': [12, 3, 4, 5, 6 , ...] 
    } 
    urllib2.urlopen("http://abc.com/api/posts/create",urllib.urlencode(data)) 

मैं एक POST अनुरोध भेजना चाहता हूं, लेकिन फ़ील्ड में से कोई एक संख्या की सूची होनी चाहिए। मैं उसे कैसे कर सकता हूँ ? (JSON?)मैं JSON के रूप में POST अनुरोध कैसे भेजूं?

+1

नहीं कि पहले से ही नंबर की एक सूची है, हालांकि है? –

+0

यह जानने के बिना उत्तर दिया जा सकता है कि एपीआई किस प्रकार की इनपुट की अपेक्षा करता है। –

+0

मेरा एपीआई एक सूची की अपेक्षा करता है। – TIMEX

उत्तर

124

अपने सर्वर पोस्ट अनुरोध उम्मीद कर रही है json होने के लिए, तो आप अपने अनुरोध के लिए एक हैडर डेटा जोड़ने के साथ ही क्रमानुसार करने की आवश्यकता होगी, तो ...

import json 
import urllib2 

data = { 
     'ids': [12, 3, 4, 5, 6] 
} 

req = urllib2.Request('http://example.com/api/posts/create') 
req.add_header('Content-Type', 'application/json') 

response = urllib2.urlopen(req, json.dumps(data)) 

यदि आप डॉन हेडर निर्दिष्ट नहीं है, यह डिफ़ॉल्ट application/x-www-form-urlencoded प्रकार होगा।

+0

मेरे पास एक प्रश्न है। क्या हेडर में कई आइटम जोड़ना संभव है ... सामग्री प्रकार और क्लाइंट-आईडी ... @jdi –

+0

@OmarJandali, प्रत्येक हेडर के लिए बस 'add_header()' को कॉल करें, जिसे आप जोड़ना चाहते हैं। – jdi

+0

मेरे पास निम्नलिखित कोड हैं लेकिन यह कुछ भी प्रिंट नहीं कर रहा है। यह यूआरएल और हेडर प्रिंट करना था, लेकिन कुछ भी मुद्रित नहीं किया गया था ... 'req = urllib.Request ('http://uat-api.synapsefi.com') req.add_header ('एक्स-एसपी-गेटवे', 'client_id_asdfeavea561va9685e1gre5ara | client_secret_4651av5sa1edgvawegv1a6we1v5a6s51gv') req.add_header ('एक्स-SP-उपयोगकर्ता-आईपी', '127.0.0.1') req.add_header ('एक्स-SP-उपयोगकर्ता', '| ge85a41v8e16v1a618gea164g65') req.add_header ('सामग्री-प्रकार', 'एप्लिकेशन/जेसन') प्रिंट (req) '... –

86

मैं अविश्वसनीय requests मॉड्यूल का उपयोग करने की सलाह देता हूं।

http://docs.python-requests.org/en/v0.10.7/user/quickstart/#custom-headers

url = 'https://api.github.com/some/endpoint' 
payload = {'some': 'data'} 
headers = {'content-type': 'application/json'} 

response = requests.post(url, data=json.dumps(payload), headers=headers) 
+0

यह मुझे 'टाइप एरर: पोस्ट() को 1 से 2 स्थितित्मक तर्कों से लेता है लेकिन 3 को – zakdances

+8

दिया गया था [नवीनतम API] (http://docs.python-requests.org/en/नवीनतम/एपीआई /) में 'json' पैरामीटर होना प्रतीत होता है ताकि आप' आयात json' और 'json.dumps() ' –

4

आप शीर्ष लेख जोड़ने के लिए है, या आप HTTP 400 त्रुटि मिल जाएगा। कोड अच्छी तरह से python2.6 पर काम करता है, centos5.4

कोड:

import urllib2,json 

    url = 'http://www.google.com/someservice' 
    postdata = {'key':'value'} 

    req = urllib2.Request(url) 
    req.add_header('Content-Type','application/json') 
    data = json.dumps(postdata) 

    response = urllib2.urlopen(req,data) 
27

अजगर 3.4.2 के लिए मैंने पाया निम्नलिखित काम करेगा:

 import urllib.request 
    import json  

    body = {'ids': [12, 14, 50]} 

    myurl = "http://www.testmycode.com" 
    req = urllib.request.Request(myurl) 
    req.add_header('Content-Type', 'application/json; charset=utf-8') 
    jsondata = json.dumps(body) 
    jsondataasbytes = jsondata.encode('utf-8') # needs to be bytes 
    req.add_header('Content-Length', len(jsondataasbytes)) 
    print (jsondataasbytes) 
    response = urllib.request.urlopen(req, jsondataasbytes) 
+0

पायथन 3.6.2 को छोड़ सकें। Req.add_header (...) के साथ केवल हेडर जोड़ना मेरे लिए काम करता है। –

2

इस अजगर के लिए एकदम सही काम करता है संस्करण 3.5, यदि यूआरएल में क्वेरी स्ट्रिंग/पैरामीटर मान है,

अनुरोध URL = https://bah2.com/ws/rest/v1/concept/

पैरामीटर मान = 21f6bb43-98a1-419d-8f0c-8133669e40ca

import requests 
r = requests.post('https://bah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca',auth=('username', 'password'),verify=False, json={"name": "Value"}) 
headers = {'Content-type': 'application/json'} 
print(r.status_code) 
+4

आपके कोड स्निपर में, हेडर परिवर्तक अप्रयुक्त रहता है – shookees

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