পাইথন অনুরোধগুলি ব্যবহার করে জেএসএন পোস্ট করুন


632

আমার একটি ক্লায়েন্ট থেকে একটি সার্ভারে একটি JSON পোস্ট করতে হবে। আমি পাইথন ২.7.১ এবং সিম্পজসন ব্যবহার করছি। ক্লায়েন্ট অনুরোধগুলি ব্যবহার করছে। সার্ভারটি চেরিপাই। আমি সার্ভার থেকে একটি হার্ড-কোডেড জেএসএন পেতে পারি (কোডটি দেখানো হয়নি) তবে যখন আমি সার্ভারে একটি জেএসএন পোস্ট করার চেষ্টা করি তখন আমি "400 বাজে অনুরোধ" পাই।

এখানে আমার ক্লায়েন্ট কোড:

data = {'sender':   'Alice',
    'receiver': 'Bob',
    'message':  'We did it!'}
data_json = simplejson.dumps(data)
payload = {'json_payload': data_json}
r = requests.post("http://localhost:8080", data=payload)

এখানে সার্ভার কোড রয়েছে।

class Root(object):

    def __init__(self, content):
        self.content = content
        print self.content  # this works

    exposed = True

    def GET(self):
        cherrypy.response.headers['Content-Type'] = 'application/json'
        return simplejson.dumps(self.content)

    def POST(self):
        self.content = simplejson.loads(cherrypy.request.body.read())

কোন ধারনা?


আমি ডকুমেন্টেশনের বাইরে সরাসরি উদাহরণের একটি স্ট্রিপ ডাউন সংস্করণ ব্যবহার করছিলাম ।
চার্লস আর

আমার মন্তব্যটি এখনও দাঁড়িয়ে আছে - চেরিপাই কোনও যুক্তি __init__সহ শ্রেণি পদ্ধতিগুলিকে কল করে না content(এবং আপনি যে লিঙ্কটি সরবরাহ করেন তাতে দাবী করে না)। তাদের কাছে থাকা বিশদ উদাহরণে, ব্যবহারকারী কোডটি সরবরাহ করে যা কল __init__করে এবং আর্গুমেন্ট সরবরাহ করে, যা আমরা এখানে দেখিনি তাই আপনার # this worksমন্তব্য প্রাসঙ্গিক হলে আপনার অবজেক্টটি কী অবস্থায় আছে তা আমার কোনও ধারণা নেই ।
নিক বেস্টিন

1
আপনি উদাহরণটি তৈরি করা হয়েছে যেখানে লাইন দেখতে জিজ্ঞাসা করছেন?
চার্লস আর

হ্যাঁ, আমি এটি পরীক্ষা করার জন্য আপনার উদাহরণটি শুরু করার চেষ্টা করছিলাম এবং আপনি কীভাবে এটি ইনস্ট্যান্ট করছেন তা আমি নিশ্চিত ছিলাম না।
নিক বেস্টিন

কোডটি পরিবর্তন হয়েছে। আমি এখন অতিরিক্ত যুক্তি ছাড়াই এটি তৈরি করছি। cherrypy.quickstart(Root(), '/', conf)
চার্লস আর

উত্তর:


1050

অনুরোধ সংস্করণ ২.৪.২ এবং তারপরে, আপনি বিকল্পভাবে কলটিতে 'জসন' পরামিতি ব্যবহার করতে পারেন যা এটি আরও সহজ করে তোলে।

>>> import requests
>>> r = requests.post('http://httpbin.org/post', json={"key": "value"})
>>> r.status_code
200
>>> r.json()
{'args': {},
 'data': '{"key": "value"}',
 'files': {},
 'form': {},
 'headers': {'Accept': '*/*',
             'Accept-Encoding': 'gzip, deflate',
             'Connection': 'close',
             'Content-Length': '16',
             'Content-Type': 'application/json',
             'Host': 'httpbin.org',
             'User-Agent': 'python-requests/2.4.3 CPython/3.4.0',
             'X-Request-Id': 'xx-xx-xx'},
 'json': {'key': 'value'},
 'origin': 'x.x.x.x',
 'url': 'http://httpbin.org/post'}

সম্পাদনা: অফিসিয়াল ডকুমেন্টেশনে এই বৈশিষ্ট্যটি যুক্ত করা হয়েছে। আপনি এটি দেখতে পারেন এখানে: ডকুমেন্টেশন অনুরোধ


114
আপনার উত্তরে হোঁচট খাওয়ার আগে আমি কতটা সময় নষ্ট করেছিলাম তা বিশ্বাস করতে পারি না। অনুরোধ দস্তাবেজ, আপগ্রেড করা প্রয়োজন একেবারে উপর কিছুই নেই jsonপ্যারামিটার। আমি এর উল্লেখ করার আগে আমাকে গিথুবে
আইএএমকেলে

1
এটি গ্রহণযোগ্য উত্তরে সেট করা কারণ এটি ২.৪.২ হিসাবে বেশি বুদ্ধিমানের। মনে রাখবেন, ক্রেজি ইউনিকোডের জন্য, এটি কাজ নাও করতে পারে।
চার্লস আর

আমি @ আইএমকেলে একই জুতা ছিল। এডাব্লুএস এর এপিআই গেটওয়ের সাথে আমার যে মাথাব্যথা ছিল তা থেকে মুক্তি পেয়েছে। এটি ডিফল্টরূপে JSON ফর্ম্যাটে পোস্টের ডেটা প্রয়োজন।
jstudios

1
একটি বোকা মত আমি অ্যাপ্লিকেশন / json বিষয়বস্তুর প্রকারের সাথে ডেটা প্যারামিটার ব্যবহার করার চেষ্টা করেছি :(
অবৈধ অপারেটর

আমি এর একটি উদাহরণ দেখেছি যা ডিক অবজেক্টটি নিয়েছিল এবং প্রেরণের আগে json.dumps (অবজেক্ট) সম্পাদন করে। এটি করবেন না ... এটি আপনার জেএসওনকে গোলমাল করে। উপরেরটি নিখুঁত..আপনি এটি একটি অজগর বস্তুটি পাস করতে পারেন এবং এটি নিখুঁত জসনে পরিণত হয়।
মাইডকনাইট

376

দেখা যাচ্ছে যে আমি শিরোনামের তথ্যটি অনুপস্থিত। নিম্নলিখিত কাজগুলি:

url = "http://localhost:8080"
data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.post(url, data=json.dumps(data), headers=headers)

গুড ধরা - আমি তোমার দেখেছি application/jsonমধ্যে GETএবং একরকম মিস আপনি এটি অনুরোধে না দিয়েছিল। আপনার কাছ থেকে কিছু ফেরত এসেছে POSTবা আপনি এটি পেতে পারেন তাও আপনাকে নিশ্চিত করতে হতে পারে 500
নিক বেস্টিন

প্রয়োজনীয় বলে মনে হচ্ছে না। আমি যখন মুদ্রণ করি r, তখন আমি পাই <Response [200]>
চার্লস আর

সার্ভারের পাশে আমি এই জসনটি কীভাবে পুনরুদ্ধার করব?
বৌদিআবিষেক

আর = অনুরোধ.কেট (' লোকালহোস্ট: 8080' ) সি = আর-কন্টেন্ট রেজাল্ট = সরলজসন.লোডস (সি)
চার্লস আর

1
json.dumpsএখানে ব্যবহার করার আগে ছোট মাথা আপ । dataএর প্যারামিটার requestsঅভিধান সাথে কাজে জরিমানা। স্ট্রিংয়ে রূপান্তর করার দরকার নেই।
অ্যাডওয়াইট এস

71

অনুরোধগুলি থেকে ২.৪.২ ( https://pypi.python.org/pypi/requests ), "জসন" প্যারামিটার সমর্থিত। "বিষয়বস্তুর ধরণ" নির্দিষ্ট করার দরকার নেই। তাই সংক্ষিপ্ত সংস্করণ:

requests.post('http://httpbin.org/post', json={'test': 'cheers'})

29

আরও ভাল উপায় :

url = "http://xxx.xxxx.xx"

datas = {"cardno":"6248889874650987","systemIdentify":"s08","sourceChannel": 12}

headers = {'Content-type': 'application/json'}

rsp = requests.post(url, json=datas, headers=headers)

18
Content-type: application/jsonযেমন অপ্রয়োজনীয় json=ইতিমধ্যে যে ইঙ্গিত।
মোশে 14

1
@ মোশে সম্পূর্ণরূপে একমত, তবে নতুন সংস্করণটির জন্য অনুরোধ করতে ইলাস্টিকের Content-type
সের্ভার

@ মোশে, যদি বিষয়বস্তুর প্রকার হয় text/html; charset=UTF-8। তাহলে উপরের কাজ করবে না?
আনু

2
" সবচেয়ে ভাল উপায় " সঠিক উত্তর পরে 3 বছর পরে WRONG উত্তরগুলি না পোস্ট করা post -1
CONvid19

3

পাইথন 3.5+ এর সাথে পুরোপুরি কাজ করে

ক্লায়েন্ট:

import requests
data = {'sender':   'Alice',
    'receiver': 'Bob',
    'message':  'We did it!'}
r = requests.post("http://localhost:8080", json={'json_payload': data})

সার্ভার:

class Root(object):

    def __init__(self, content):
        self.content = content
        print self.content  # this works

    exposed = True

    def GET(self):
        cherrypy.response.headers['Content-Type'] = 'application/json'
        return simplejson.dumps(self.content)

    @cherrypy.tools.json_in()
    @cherrypy.tools.json_out()
    def POST(self):
        self.content = cherrypy.request.json
        return {'status': 'success', 'message': 'updated'}

3

(ডেটা / জসন / ফাইল) এর মধ্যে কোন প্যারামিটার ব্যবহার করা উচিত, এটি আসলে কনটেন্টটাইপ নামের একটি অনুরোধ শিরোনামের উপর নির্ভর করে (সাধারণত আপনার ব্রাউজারের বিকাশকারী সরঞ্জামগুলির মাধ্যমে এটি পরীক্ষা করুন),

যখন সামগ্রী-প্রকারটি অ্যাপ্লিকেশন / x-www-form-urlencoded হয়, কোডটি এমন হওয়া উচিত:

requests.post(url, data=jsonObj)

যখন সামগ্রী-প্রকার অ্যাপ্লিকেশন / জসন হয়, তখন আপনার কোডটি নীচের একটি হতে পারে:

requests.post(url, json=jsonObj)
requests.post(url, data=jsonstr, headers={"Content-Type":"application/json"})

যখন সামগ্রী-প্রকারটি মাল্টিপার্ট / ফর্ম-ডেটা হয়, তখন এটি ফাইলগুলি আপলোড করতে ব্যবহৃত হয়, সুতরাং আপনার কোডটি হওয়া উচিত:

requests.post(url, files=xxxx)

যীশু খ্রীষ্ট, আপনাকে ধন্যবাদ। আমি কয়েক মুহুর্ত আগে আমার চুল বের করে দিচ্ছিলাম।
ভাহাগন তুমানিয়ান

খুশি যা আপনাকে সহায়তা করতে পারে:)
২১
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.