मैं JSON के रूप में POST अनुरोध कैसे भेजूं?


105
data = {
        'ids': [12, 3, 4, 5, 6 , ...]
    }
    urllib2.urlopen("http://abc.com/api/posts/create",urllib.urlencode(data))

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


1
यह पहले से ही संख्या की एक सूची नहीं है, हालांकि?
वायन लू

यह जानने के बिना इसका जवाब नहीं दिया जा सकता है कि एपीआई किस तरह के इनपुट की उम्मीद करता है।
निकल्स बी

1
@WaynnLue API सर्वर को एक स्ट्रिंग के रूप में मिल रहा है, एक सूची के रूप में नहीं।
TIMEX

1
क्या मुझे हेडर को "एप्लिकेशन / जसन" या कुछ और के रूप में सेट करना है?
TIMEX

जवाबों:


154

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

अजगर 2.x

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))

अजगर 3.x

https://stackoverflow.com/a/26876308/496445


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


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

@ ओमरजंडली, बस add_header()फिर से कॉल करें, प्रत्येक हेडर के लिए जिसे आप जोड़ना चाहते हैं।
जीडी

मेरे पास निम्नलिखित कोडित हैं लेकिन यह कुछ भी नहीं छाप रहा है। यह url और हेडर को प्रिंट करने वाला था, लेकिन कुछ भी प्रिंट नहीं किया गया था req = urllib.Request('http://uat-api.synapsefi.com') req.add_header('X-SP-GATEWAY', 'client_id_asdfeavea561va9685e1gre5ara|client_secret_4651av5sa1edgvawegv1a6we1v5a6s51gv') req.add_header('X-SP-USER-IP', '127.0.0.1') req.add_header('X-SP-USER', '| ge85a41v8e16v1a618gea164g65') req.add_header('Content-Type', 'application/json') print(req)...
उमर जंडाली

urllib2 को मान्यता नहीं दी गई थी इसलिए मैंने सिर्फ urllib का उपयोग किया। मुझे अनुरोध के साथ एक त्रुटि भी मिल रही है। The view tab.views.profileSetup didn't return an HttpResponse object. It returned None instead. @ जदी
उमर जंडाली

@ उमरजंदली, कृपया ध्यान रखें कि यह उत्तर मूल रूप से 2012 में अजगर 2.x के तहत दिया गया था। आप Python3 का उपयोग कर रहे हैं इसलिए आयात अलग होगा। अब यह होगा import urllib.requestऔर urllib.request.Request()। इसके अलावा, रीक ऑब्जेक्ट को प्रिंट करना कुछ भी दिलचस्प नहीं है। आप स्पष्ट रूप से देख सकते हैं कि हेडर को प्रिंट करके जोड़ा गया है req.headers। इसके अलावा, मैं sur नहीं हूं कि यह आपके आवेदन में काम क्यों नहीं कर रहा है।
जीडी

113

मैं अविश्वसनीय 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)

यह मुझे देता हैTypeError: post() takes from 1 to 2 positional arguments but 3 were given
zakdances

66

अजगर 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)

1
Python3.6.2 ने यह काम किया। केवल req.add_header (...) के साथ हेडर जोड़ने से मेरे लिए काम किया।
शालीन एलके

18

Python 3.5यदि URL में क्वेरी स्ट्रिंग / पैरामीटर मान है, तो यह सही काम करता है ,

अनुरोध URL = https://bah2.com/ws/rest/v1/concept/
पैरामीटर मान = 21f6bb43-98a1-419d-8f0c-8133669e40ca

import requests

url = 'https://bahbah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca'
data = {"name": "Value"}
r = requests.post(url, auth=('username', 'password'), verify=False, json=data)
print(r.status_code)

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

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)

2

यहाँ पायथन मानक पुस्तकालय से urllib.request ऑब्जेक्ट का उपयोग करने का एक उदाहरण दिया गया है।

import urllib.request
import json
from pprint import pprint

url = "https://app.close.com/hackwithus/3d63efa04a08a9e0/"

values = {
    "first_name": "Vlad",
    "last_name": "Bezden",
    "urls": [
        "https://twitter.com/VladBezden",
        "https://github.com/vlad-bezden",
    ],
}


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
}

data = json.dumps(values).encode("utf-8")
pprint(data)

try:
    req = urllib.request.Request(url, data, headers)
    with urllib.request.urlopen(req) as f:
        res = f.read()
    pprint(res.decode())
except Exception as e:
    pprint(e)

1

नवीनतम अनुरोधों के पैकेज में, आप एक जौन तानाशाही भेजने के लिए विधि jsonमें पैरामीटर का उपयोग कर सकते हैं requests.post(), और Content-Typeहेडर में सेट किया जाएगा application/json। हेडर को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है।

import requests

payload = {'key': 'value'}

requests.post(url, json=payload)

ध्यान दें कि यह एकल उद्धरणों के साथ POSTed json में परिणाम देगा, जो तकनीकी रूप से अमान्य है।
जेथ्रो

@ जेठ्रो क्या आपने एकल उद्धरणों का उपयोग करते समय त्रुटियां देखी हैं? पायथन में एकल उद्धरण का उपयोग करना मान्य है। व्यक्तिगत रूप से, मैं इस बारे में किसी भी मुद्दे से मुलाकात नहीं की है।
jdhao

आह क्षमायाचना मैं गलत था, मैंने सोचा कि मेरा सर्वर सिंगल-उद्धृत JSON प्राप्त कर रहा था, लेकिन यह एक अलग मुद्दा और कुछ भ्रामक डिबगिंग निकला। चीयर्स, यह हेडर को मैन्युअल रूप से निर्दिष्ट करने की तुलना में बहुत अधिक महत्वपूर्ण है!
जेथ्रो

0

यह एक एपिस के साथ मेरे लिए ठीक काम करता है

import requests

data={'Id':id ,'name': name}
r = requests.post( url = 'https://apiurllink', data = data)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.