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

Tôi muốn gửi yêu cầu POST, 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?)Làm cách nào để gửi yêu cầu POST dưới dạng JSON?

+1

Mà không phải là đã là một danh sách các số, mặc dù? –

+0

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

+0

API của tôi mong đợi một danh sách. – TIMEX

Trả lời

124

Nếu máy chủ của bạn đang mong đợi các yêu cầu POST là json, sau đó bạn sẽ cần phải thêm một tiêu đề, và cũng có thể serialize dữ liệu cho yêu cầu của bạn ...

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

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

+0

Tôi có một câu hỏi. là có thể thêm nhiều mục trong tiêu đề ... như loại nội dung & id ứng dụng ... @jdi –

+0

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

+0

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

86

Tôi khuyên bạn nên sử dụng mô-đun requests không thể tin được.

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

Điều này cho tôi 'TypeError: post() lấy từ 1 đến 2 đối số vị trí nhưng 3 đã được cho' – zakdances

+8

[API mới nhất] (http://docs.python-requests.org/en/latest/api /) xuất hiện để có tham số 'json' để bạn có thể bỏ' json' và 'json.dumps()' –

4

Bạn phải thêm tiêu đề, hoặc bạn sẽ nhận được http 400 lỗi. Mã này 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) 
27

cho python 3.4.2 tôi tìm thấy những điều sau đây sẽ làm việc:

 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

Python3.6.2 thành công. Chỉ thêm tiêu đề với req.add_header (...) đã làm việc cho tôi. –

2

này hoạt động hoàn hảo cho Python Phiên bản 3.5, Nếu URL chứa Chuỗi truy vấn/Giá trị tham số,

Yêu cầu URL = https://bah2.com/ws/rest/v1/concept/

giá trị Parameter = 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

trong trình mã mã của bạn, tiêu đề biến vẫn không sử dụng – shookees

Các vấn đề liên quan