Estoy trabajando en una aplicación web que interactúa con una API REST personalizada. Es básicamente una tabla de datos que se actualiza a través de la aplicación. Estoy tratando de usar el métodoPATCH para las actualizaciones, pero Apache devuelve un error 404 cuando envío la solicitud.
Lo extraño es que una solicitud GET a la misma URL (es decir, pegar la URL en una ventana separada del navegador) funciona bien. Algunos detalles:
Parece que Apache está bloqueando la solicitud antes de que llegue a la API REST personalizada. Puedo ver las solicitudes PATCH y GET en los registros de acceso de Apache, pero solo aparece la solicitud GET en el registro de la API REST personalizada (FWIW, la API REST personalizada se implementa en Flask ) usando Gunicorn como servidor de alojamiento.
Ejemplos de registros de acceso de Apache:
192.168.0.1 - desconocido [27/ago/2021:18:23:27 +0000] "PATCH /admin-api/services/12872 HTTP/1.1" 404 14 "https://www.example.com/admin-dashboard /"...
192.168.0.1 - usuario administrador [27/ago/2021:18:23:43 +0000] "GET /admin-api/services/12872 HTTP/1.1" 200 988 "-" ...
Una cosa que noté es que la solicitud PATCH está reemplazando el nombre de usuario con "desconocido". Esto me llevó a creer que algo andaba mal con CORS. Encontré una configuración de " Encabezado " a la que le faltaban OPCIONES y PARCHE, así que los agregué. Sigo viendo el mismo problema. A continuación se muestra la configuración actual de la opción:
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PATCH"
No veo solicitudes de OPCIONES previas al vuelo en los registros de Apache o en la ventana de la consola del navegador. He probado con Google Chrome (92.0) y Firefox (91.0).
Las solicitudes PATCH tienen el encabezado "access-control-allow-origin" establecido en "POST, GET, OPTIONS, PATCH"
La configuración del proxy de Apache utiliza un socket de Unix para enviar un proxy a Gunicorn:
<Location /admin-api> ProxyPass unix:/run/admin-api.sock|http://127.0.0.1 </Location>
Solicitud de recuperación de JavaScript: ( apiUrl
e id
son variables establecidas anteriormente en la función):
let resp = await fetch(`${apiUrl}/services/${id}`, { credentials: "include", method: "PATCH", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify({ data: { min: 1, max: 3 }, }), });