Cuando uso el insomnio para enviar una solicitud de publicación, recibo un código 200 y todo funciona bien, pero cuando envío una solicitud de recuperación a través de javascript, aparece un 405 'error de método no permitido', aunque he permitido las solicitudes de publicación de el lado del servidor. (El código del lado del servidor usa python).
Código del lado del servidor
from pydantic import BaseModel from typing import Optional from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app = FastAPI() origins = ["*"] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["POST", "GET"], allow_headers=["*"], ) class data_format(BaseModel): comment_id : int username : str comment_body : Optional[str] = None @app.post('/post/submit_post') async def sumbit_post(somename_3: data_format): comment_id = somename_3.comment_id username = somename_3.username comment_body = somename_3.comment_body # add_table_data(comment_id, username, comment_body) //Unrelated code return { 'Response': 'Submission received', 'Data' : somename_3 }codigo js
var payload = { "comment_id" : 4, "username" : "user4", "comment_body": "comment_4" }; fetch("/post/submit_post", { method: "POST", body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' } }) .then(function(res){ return res.json(); }) .then(function(data){ alert( JSON.stringify( data ) ) }) El error
¿Qué debo hacer para sortear este error?
Gracias por adelantado.
Para empezar, su código parece estar funcionando bien. La única parte que tuvo que cambiarse durante la prueba (localmente) fue la URL en la búsqueda de /post/submit_post a (por ejemplo) http://127.0.0.1:8000/post/submit_post , pero supongo que ya cambió eso usando el nombre de dominio que apunta a su aplicación.
El código de estado 405 Method Not Allowed no está relacionado con CORS. Si POST no se incluyera en la lista allow_methods , el código de estado de respuesta sería 400 Bad Request (podría intentar eliminarlo de la lista para probarlo). De la referencia anterior:
El código de estado de respuesta
405 Method Not Alloweddel Protocolo de transferencia de hipertexto (HTTP) indica que el servidor conoce el método de solicitud, pero el recurso de destino no admite este método .El servidor debe generar un campo de encabezado
Allowen una respuesta de código de estado 405. El campo debe contener una lista de métodos que el recurso de destino admite actualmente.
Por lo tanto, el código de estado 405 indica que el servidor recibió y reconoció la solicitud POST , pero el servidor rechazó ese método HTTP específico para ese punto final en particular. Por lo tanto, le sugiero que se asegure de que el decorador del punto final en la versión que está ejecutando esté definido como @app.post y que no haya otro punto final con la misma ruta usando @app.get . Además, asegúrese de que no haya ningún redirect involuntario dentro del punto final, ya que esa sería otra posible causa de ese código de estado de respuesta. Para referencia futura, al redirigir de una POST a GET , el código de estado de respuesta debe cambiar a 303 , como se muestra aquí . Además, podría intentar permitir todos los métodos HTTP con el comodín * (es decir, allow_methods=['*'] ) y ver cómo funciona (aunque no debería estar relacionado con eso). Por último, esto también podría estar relacionado con las configuraciones del servicio de alojamiento en el que está ejecutando la aplicación; por lo tanto, podría ser bueno echar un vistazo a eso también.