peticiones - request python example
Publicar JSON usando Python Requests (6)
A partir de las Solicitudes de la versión 2.4.2 y posteriores, también puede usar el parámetro ''json'' en la llamada, lo que lo hace más simple.
>>> 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''}
EDITAR: Esta característica ha sido añadida a la documentación oficial. Puedes verlo aquí: Solicitud de documentación.
Necesito enviar un JSON de un cliente a un servidor. Estoy usando Python 2.7.1 y simplejson. El cliente está utilizando peticiones. El servidor es CherryPy. Puedo obtener un JSON codificado en el servidor (no se muestra el código), pero cuando intento enviar un JSON al servidor, obtengo "400 Solicitud incorrecta".
Aquí está mi código de cliente:
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)
Aquí está el código del servidor.
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())
¿Algunas ideas?
De las solicitudes 2.4.2 ( https://pypi.python.org/pypi/requests ), se admite el parámetro "json". No es necesario especificar "Tipo de contenido". Así que la versión más corta:
requests.post(''http://httpbin.org/post'', json={''test'': ''cheers''})
Esto funciona perfecto para Python Versión 3.5, si la URL contiene el valor de la cadena / parámetro de consulta,
URL de solicitud = https://bah2.com/ws/rest/v1/concept/
Valor del parámetro = 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)
Funciona perfectamente con python 3.5+
cliente:
import requests
data = {''sender'': ''Alice'',
''receiver'': ''Bob'',
''message'': ''We did it!''}
r = requests.post("http://localhost:8080", json={''json_payload'': data})
servidor:
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''}
La mejor manera es :
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)
Resulta que me faltaba la información del encabezado. Los siguientes trabajos:
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)