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

Chcę wysłać żądanie POST, ale jedno z pól powinno być listą liczb. Jak mogę to zrobić ? (JSON?)Jak wysłać żądanie POST jako JSON?

+1

Czy to nie jest już lista numerów, chociaż? –

+0

Nie można odpowiedzieć na to pytanie, nie wiedząc, jakiego rodzaju danych wejściowych oczekuje interfejs API. –

+0

Moje API oczekuje listy. – TIMEX

Odpowiedz

124

Jeśli serwer oczekuje na żądania POST być json, wtedy trzeba dodać nagłówek, a także szeregować dane na żądanie ...

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

jeśli nie Podaj nagłówek, będzie to domyślny typ application/x-www-form-urlencoded.

+0

Mam pytanie. czy jest możliwe dodanie wielu pozycji w nagłówku ... jak typ zawartości i id klienta ... @jdi –

+0

@OmarJandali, po prostu wywołaj 'add_header()' dla każdego nagłówka, który chcesz dodać. – jdi

+0

Mam następujące kodowane, ale nie jest drukowanie niczego. miał wydrukować adres URL i nagłówki, ale nic nie zostało wydrukowane ... '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) '... –

86

Polecam korzystanie z niesamowitego modułu 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) 
+0

To daje mi 'TypeError: post() pobiera od 1 do 2 argumentów pozycyjnych, ale 3 zostały podane' – zakdances

+8

[najnowszy interfejs API] (http://docs.python-requests.org/en/latest/api /) wydaje się mieć parametr 'json', więc możesz pominąć' import json' i 'json.dumps()' –

4

Trzeba dodać nagłówek, czy dostaniesz HTTP 400 błąd. Kod działa dobrze na python2.6, centos5.4

Kod:

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

dla Pythona 3.4.2 Znalazłem następujący zadziała:

 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 to działało. Dodawano tylko nagłówek z req.add_header (...). –

2

Działa to idealny dla Pythona Wersja 3.5, jeśli adres URL zawiera wartość ciągu zapytania/parametru zapytania,

Adres URL żądania = https://bah2.com/ws/rest/v1/concept/

Wartość parametru = 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

w kodzie snajperskim zmienna nagłówków pozostaje nieużywana – shookees

Powiązane problemy