Làm cách nào để gửi yêu cầu ĐĂNG dưới dạng JSON?


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

Tôi muốn gửi một yêu cầu ĐĂNG, nhưng một trong các trường phải là danh sách các số. Làm thế nào tôi có thể làm điều đó ? (JSON?)


1
Tuy nhiên, đó không phải đã là một danh sách các con số?
Waynn Lue

Điều này không thể được trả lời nếu không biết loại đầu vào mà API mong đợi.
Niklas B.

1
@WaynnLue máy chủ API nhận được điều đó dưới dạng một chuỗi, không phải danh sách.
TIMEX

1
Tôi có phải đặt tiêu đề là "application / json" hay gì đó không?
TIMEX

Câu trả lời:


154

Nếu máy chủ của bạn đang mong đợi yêu cầu POST là json, thì bạn sẽ cần thêm tiêu đề và cũng tuần tự hóa dữ liệu cho yêu cầu của mình ...

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

Python 3.x

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


Nếu bạn không chỉ định tiêu đề, nó sẽ là application/x-www-form-urlencodedkiểu mặc định .


Tôi có một câu hỏi. là nó có thể để thêm nhiều mục trong tiêu đề ... như kiểu nội dung & client-id ... @jdi
Omar Jandali

@OmarJandali, chỉ cần gọi add_header()lại, cho mỗi tiêu đề bạn muốn thêm.
jdi

tôi có mã sau đây nhưng nó không in bất cứ điều gì. nó được cho là để in các url và tiêu đề nhưng không được in ... 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)...
Omar Jandali

urllib2 không được nhận dạng vì vậy tôi chỉ sử dụng urllib. Tôi cũng gặp lỗi với yêu cầu. The view tab.views.profileSetup didn't return an HttpResponse object. It returned None instead. @jdi
Omar Jandali

@OmarJandali, xin lưu ý rằng câu trả lời này ban đầu được đưa ra vào năm 2012, trong python 2.x. Bạn đang sử dụng Python3 nên các lần nhập sẽ khác. Bây giờ nó sẽ là import urllib.requesturllib.request.Request(). Hơn nữa, việc in đối tượng yêu cầu không có gì thú vị. Bạn có thể thấy rõ các tiêu đề đã được thêm vào bằng cách in req.headers. Ngoài ra, tôi không hiểu tại sao nó không hoạt động trong ứng dụng của bạn.
jdi


66

đối với python 3.4.2, tôi thấy điều sau sẽ hoạt động:

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 điều này đã hoạt động. Chỉ thêm tiêu đề với req.add_header (...) phù hợp với tôi.
Shalin LK,

18

Điều này hoạt động hoàn hảo Python 3.5nếu URL chứa chuỗi truy vấn / giá trị tham số,

URL yêu cầu = https://bah2.com/ws/rest/v1/concept/
Giá trị tham số = 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
trong trình
cắt tỉa

4

Bạn phải thêm tiêu đề, nếu không bạn sẽ gặp lỗi http 400. Mã hoạt động tốt trên python2.6, centos5.4

mã:

    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

Đây là một ví dụ về cách sử dụng đối tượng urllib.request từ thư viện chuẩn Python.

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

Trong gói yêu cầu cuối cùng, bạn có thể sử dụng jsontham số trong requests.post()phương thức để gửi một json dict và Content-Typetiêu đề trong sẽ được đặt thành application/json. Không cần chỉ định tiêu đề một cách rõ ràng.

import requests

payload = {'key': 'value'}

requests.post(url, json=payload)

Lưu ý rằng điều này sẽ dẫn đến việc POSTed json với các dấu ngoặc kép, điều này không hợp lệ về mặt kỹ thuật.
Jethro

@Jethro Bạn có gặp lỗi khi sử dụng dấu ngoặc kép không? Sử dụng dấu nháy đơn trong Python là hợp lệ. Cá nhân tôi chưa gặp bất kỳ vấn đề nào liên quan đến việc này.
jdhao

Rất tiếc, tôi đã nhầm lẫn, tôi nghĩ máy chủ của mình đang nhận được JSON được trích dẫn đơn lẻ nhưng hóa ra đó là một vấn đề riêng biệt và một số gỡ lỗi gây hiểu lầm. Chúc mừng, điều này gọn gàng hơn nhiều so với việc phải chỉ định tiêu đề theo cách thủ công!
Jethro

0

Cái này phù hợp với tôi với apis

import requests

data={'Id':id ,'name': name}
r = requests.post( url = 'https://apiurllink', data = data)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.