Estoy trabajando en una aplicación web que involucra un mapa. Estoy tratando de enviar la ubicación actual del mapa desde mi index.js al servidor del matraz para su procesamiento. Recibo una solicitud POST incorrecta 400 con el error
He estado pensando en esto, pero no he sido capaz de resolverlo. Aquí está mi código lateral de Flask. Aquí puede ver que siempre exceptúa y el servidor del matraz recibe un dict vacío:
from flask import Flask, render_template, request app = Flask(__name__, template_folder='templates') @app.route('/', methods=["GET"]) def index(): return render_template("index.html") @app.route('/', methods=["POST"]) def post(): if request.method == 'POST': try: data = request.json['data'] print(data) except Exception as e: data = {} print(e) return data if __name__ == "__main__": app.run(debug=True)y esta es la función donde trato de enviar la ubicación a través de ajax:
function success(pos){ const posi = { lat: (pos.coords.latitude), lng: (pos.coords.longitude), }; alert(posi.lat) $.ajax({ method : "POST", url : "/", data: posi, contentType: 'application/json', success: function(result) { alert("yay"); },error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Status: " + textStatus); alert("Error: " + errorThrown); } }); }He usado la API de geolocalización aquí. Esta función anterior es llamada por la siguiente línea:
navigator.geolocation.getCurrentPosition(success, error, options);
He probado los valores con alertas, y parece que se está disparando el éxito. Sin embargo, parece que no puedo entender por qué esto no funciona. Intenté usar data: {'data': posi} en su lugar, pero no funcionó.
¡Gracias!
Editar: también agregué una asignación de la variable 'datos' en la cláusula de excepción, pero parece que está predeterminado de todos modos.
Si examina lo que se pasa en el cuerpo de la solicitud, verá que data se convierten en parámetros de URL (consulte a continuación). Primero debe convertir los datos a una cadena JSON. A continuación, el JSON de la solicitud no está envuelto en un dict adicional con 'data' como única clave. Tampoco necesita el bloque if .
from flask import Flask, render_template, request app = Flask(__name__, template_folder='templates') @app.route('/', methods=["GET"]) def index(): return render_template("index.html") @app.route('/', methods=["POST"]) def post(): print(request.data) try: data = request.json except Exception as e: data = {'error': repr(e)} return data if __name__ == "__main__": app.run(debug=True)Hacer una solicitud POST con el siguiente error en el lado de Python:
$.ajax({ method: 'POST', url: '/', data: {'lat': 12.3, 'lon': 45.6}, contentType: 'application/json', success: function(res){console.log(res);} }) y el request.data impreso da lo siguiente:
b'lat=12.3&lon=45.6'y el registro de la consola muestra:
{'error': "<BadRequest '400: Bad Request'>"} Entonces puede ver, el cuerpo de la solicitud ajax no es JSON adecuado en absoluto. Para solucionar esto, debemos convertirlo a JSON antes de realizar la solicitud usando JSON.stringify
$.ajax({ method: 'POST', url: '/', data: JSON.stringify({'lat': 12.3, 'lon': 45.6}), contentType: 'application/json', success: function(res){console.log(res);} }) y ahora el request.data impreso da lo que queremos ver:
b'{"lat":12.3,"lon":45.6}'y el registro de la consola también muestra lo que esperamos:
{lat: 12.3, lon: 45.6}