Реализация API в вебсервере для возврата разных типов данных на примере flask
Для примера пусть сервер возвращает IP клиента
Сделал возврат как html, как сделать возврат в json и xml?
import logging
from flask import Flask, request
app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)
@app.route('/')
def index():
return request.remote_addr
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=5000
)
Ответы (1 шт):
Чтобы flask вернул данные в json достаточно, например, вернуть словарь, пусть это будет {'ip': request.remote_addr}
А чтобы flask вернул как xml нужно вернуть как строку/байты и указать тип, например, text/xml, чтобы клиент имел представление о типе данных от сервера. Для этого нужно вернуть объект Response.
Строку xml можно и самостоятельно сгенерировать (типа <ip>127.0.0.1</ip>), но я предпочту сделать через библиотеку, например, xml.etree.ElementTree
Пример:
import logging
import xml.etree.ElementTree as ET
from flask import Flask, request, Response
app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)
@app.route('/')
def index():
return request.remote_addr
@app.route('/json')
def get_json():
return {
'ip': request.remote_addr,
}
@app.route('/xml')
def get_xml():
root = ET.Element('ip')
root.text = request.remote_addr
xml_bytes = ET.tostring(root, encoding="utf-8", xml_declaration=True)
return Response(xml_bytes, mimetype='text/xml')
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=5000
)
Результат
Пусть, ip будет 10.10.10.10), обратите внимание на заголовок ответа Content-Type:
http://10.10.10.10:5000/ (
Content-Type: text/html; charset=utf-8):10.7.8.31http://10.10.10.10:5000/xml (
Content-Type: text/xml; charset=utf-8):<?xml version='1.0' encoding='utf-8'?> <ip>10.7.8.31</ip>http://10.10.10.10:5000/json (
Content-Type: application/json):{"ip":"10.7.8.31"}