আমি কীভাবে জেএসএন হিসাবে একটি পোষ্ট অনুরোধ পাঠাব?


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

আমি একটি পোস্ট অনুরোধ পাঠাতে চাই, তবে ক্ষেত্রগুলির মধ্যে একটিতে সংখ্যার একটি তালিকা হওয়া উচিত। আমি এটা কিভাবে করবো ? (তাদেরকে JSON?)


1
যদিও এটি ইতিমধ্যে সংখ্যার একটি তালিকা নয়?
ওয়েন লু

এপিআই কী ধরণের ইনপুট প্রত্যাশা করে তা জেনে উত্তর দেওয়া যায় না।
নিক্লাস বি।

1
@ ওয়েইনল্যু এপিআই সার্ভার এটি স্ট্রিং হিসাবে পাচ্ছে, তালিকা নয়।
টিমেক্স

1
আমাকে কি "অ্যাপ্লিকেশন / জেসন" বা অন্য কিছু হিসাবে শিরোনাম সেট করতে হবে?
টিমেক্স

উত্তর:


154

যদি আপনার সার্ভারটি পোস্টের অনুরোধটি জেসন হওয়ার প্রত্যাশা করে, তবে আপনাকে একটি শিরোনাম যুক্ত করতে হবে এবং আপনার অনুরোধের জন্য ডেটাটি সিরিয়ালাইজ করা দরকার ...

পাইথন 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টাইপ হবে।


আমার একটা প্রশ্ন আছে. শিরোনামে একাধিক আইটেম যুক্ত করা সম্ভব ... বিষয়বস্তুর ধরণ এবং ক্লায়েন্ট-আইডি এর মতো ... @ জদি
ওমর

@ ওমরজন্ডালি, add_header()আপনি যে প্রতিটি শিরোনাম যুক্ত করতে চান তার জন্য কেবল আবার কল করুন।
jdi

আমি নিম্নলিখিত কোডেড আছে কিন্তু এটি কিছু মুদ্রণ করছে না। এটি ইউআরএল এবং শিরোনামগুলি প্রিন্ট করার কথা ছিল তবে কিছুই মুদ্রিত হয়নি ... 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. @ জেডি
ওমর

@ ওমরজান্দালি, দয়া করে মনে রাখবেন যে উত্তরটি মূলত পাইথন ২.x এর অধীনে ২০১২ সালে দেওয়া হয়েছিল। আপনি পাইথন 3 ব্যবহার করছেন তাই আমদানি আলাদা হবে। এটা এখন হবে import urllib.requestএবং urllib.request.Request()। তদ্ব্যতীত, রেকর্ড অবজেক্টটি মুদ্রণ আকর্ষণীয় কিছু করে না। আপনি স্পষ্ট দেখতে পাচ্ছেন শিরোনামগুলি মুদ্রণের মাধ্যমে যুক্ত করা হয়েছে req.headers। এর বাইরেও, আমি সুর করছি না কেন এটি আপনার আবেদনে কাজ করছে না।
jdi

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
জাকদানস

66

অজগর ৩.৪.২ এর জন্য আমি নিম্নলিখিতগুলি কাজ করবে বলে জানতে পেরেছি:

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
পাইথন ৩..6.২ এটি কাজ করেছে। শুধুমাত্র req.add_header (...) দিয়ে হেডার যুক্ত করা আমার পক্ষে কাজ করেছে।
শালিন এলকে

18

এটি Python 3.5URL এর জন্য কোয়েরি স্ট্রিং / প্যারামিটার মান ধারণ করে নিখুঁতভাবে কাজ করে ,

অনুরোধ 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
আপনার কোড স্নিপারে, শিরোনামের পরিবর্তনশীল অব্যবহৃত থাকে
শুক করুন

4

আপনাকে শিরোনাম যুক্ত করতে হবে, অথবা আপনি 400 টি ত্রুটি পাবেন। কোডটি পাইথন 2.6, সেন্টোস 5.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)

নোট করুন যে এর ফলে একক উদ্ধৃতি সহ পোস্টেড জসন হবে, যা প্রযুক্তিগতভাবে অবৈধ।
জেথ্রো

@ জেথ্রো আপনি কি একক উদ্ধৃতি ব্যবহার করার সময় ত্রুটি লক্ষ্য করেছেন? পাইথনে একক উদ্ধৃতি ব্যবহার করা বৈধ। ব্যক্তিগতভাবে, আমি এ সম্পর্কিত কোনও সমস্যা পূরণ করি নি।
jdhao

আঃ ক্ষমা চেয়ে আমি ভুল করেছিলাম, আমি ভেবেছিলাম আমার সার্ভারটি একক-উদ্ধৃত জেএসওএন পাচ্ছে তবে এটি একটি পৃথক সমস্যা এবং কিছু বিভ্রান্তিমূলক ডিবাগ হিসাবে পরিণত হয়েছে। চিয়ার্স, এই ম্যানুয়ালি শিরোনাম নির্দিষ্ট করার চেয়ে অনেক পরিপাটি!
জেঠরো

0

এইটি এপিএস দিয়ে আমার জন্য ভাল কাজ করে

import requests

data={'Id':id ,'name': name}
r = requests.post( url = 'https://apiurllink', data = data)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.