# Rest

La clase Rest contiene métodos estáticos que permiten enviar la respuesta al usuario (usualmente en formato json)

# Métodos disponibles

  • response
  • response_custom
  • response_xml
  • response_csv
  • raw_response

# response

El método response espera los siguientes parámetros:

  • status_http: El código http que será enviado por el servidor.
  • message: El mensaje de respuesta (por defecto success)
  • data: Un objeto con la información la respuesta solicitada.
  • status_code: Un codigo de estado adicional, diferente a codigo de estado http (este campo no es requerido).
  • errors: Sí se envía, sobreescribe el json de respuesta, para visualizar errores personalizados (este campo no es requerido).
@api.representation('application/json')
def response(status_http=200, message='success', data=None, status_code=None, errors=None):
    ...

La salida por defecto es:

{
    "status": 200,
    "message": "success",
    "data": null
}

# Un ejemplo:

from app.ext.rest import Rest, HttpStatus
...

resp = {
    "name": app_to_find.name,
    "description": app_to_find.description,
    "url": app_to_find.url
}

return Rest.response(200, HttpStatus.OK, resp)

salida:

{
    "status": 200,
    "message": "success",
    "data": {
        "name": "John Doe",
        "description": "user admin",
        "url": "https://www.servinformacion.com"
    }
}

Si se envia el parámetro errors, el valor de data es omitido y enviado como null

# Un ejemplo:

from app.ext.rest import Rest, HttpStatus
...

reason = 'there is no information to update, check if the submitted fields match the original record'

return Rest.response(400, HttpStatus.DEFAULT_ERROR_MESSAGE, errors=reason)

salida:

{
    "status": 400,
    "message": "An error occurred. Please try again.!",
    "data": null,
    "error":"there is no information to update, check if the submitted fields match the original record"
}

# response_custom

El método response_custom espera los siguientes parámetros:

  • status_http: El código http que será enviado por el servidor.
  • data: Un objeto con la información la respuesta solicitada.
@api.representation('application/json')
def response_custom(status_http=200, data=None):
    ...

La salida por defecto es:

{
    "message": "success",
}

# Un ejemplo:

from app.ext.rest import Rest
...

data = {
    "status": "Bad Request",
    "errors": [314, 16],
    "message": "some reason",
    "data": None
}

return Rest.response_custom(200, data)

salida:

{
    "status": "Bad Request",
    "errors": [314, 16],
    "message": "some reason",
    "data": null
}

# response_xml

Este metodo envía cabeceras 'application/xml' por defecto.

El método response_xml espera los siguientes parámetros:

  • status_http: El código http que será enviado por el servidor.
  • data: Un objeto con la información la respuesta solicitada.
def response_xml(status_http=200, data=None):
    ...

La salida por defecto es:

<root></root>

# Un ejemplo:

from app.ext.rest import Rest
...

xml_example = """
<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <status>200</status>
  <message>success</message>
  <data>
    <name>John Doe</name>
    <description>user admin</description>
    <url>https://www.servinformacion.com</url>
  </data>
</root>
"""

return Rest.response_xml(200, xml_example)

salida:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <status>200</status>
  <message>success</message>
  <data>
    <name>John Doe</name>
    <description>user admin</description>
    <url>https://www.servinformacion.com</url>
  </data>
</root>

# response_csv

Este metodo envía cabeceras 'application/csv' por defecto.

El método response_csv espera los siguientes parámetros:

  • status_http: El código http que será enviado por el servidor.
  • data: Un objeto con la información la respuesta solicitada.
  • filename: El nombre que contendrá el archivo al ser descargado (por defecto exportCSV.csv).
def response_csv(status_http=200, data=None, filename='exportCSV'):
    ...

La salida por defecto es:

<!-- Write your comments here -->

# Un ejemplo:

import StringIO
import csv
from app.ext.rest import Rest, HttpStatus

...

filename = "users"
sIO = StringIO.StringIO()
writer = csv.writer(sIO, delimiter=';', quoting=csv.QUOTE_MINIMAL)

headers = ["name", "description", "url"]

writer.writerow(headers)

try:
    for row in data:
        writer.writerow([row.name, row.description, row.url])

    return Rest.response_csv(200, sIO.getvalue(), filename)
except Exception as e:
    print("genCSV Exception:", e)
    return Rest.response(400, HttpStatus.UNEXPECTED_ERROR, {'reason': str(e)})

salida:

<!-- users.csv file here -->

# raw_response

Este metodo envía cabeceras 'text/html' por defecto.

El método raw_response espera los siguientes parámetros:

  • status_http: El código http que será enviado por el servidor.
  • data: Un objeto con la información la respuesta solicitada.
def raw_response(status_http=200, data=None):
    ...

La salida por defecto es:

<!-- Write your comments here -->

# Un ejemplo:

from app.ext.rest import Rest
...

data = "OK"

return Rest.raw_response(200, data)

salida:

OK