Lucrez la o aplicație web care interacționează cu un API REST personalizat. Practic este un tabel de date care este actualizat prin intermediul aplicației. Încerc să folosesc PLASTURE pentru actualizări, dar Apache returnează o eroare 404 când trimit cererea.
Lucrul ciudat este că solicitările GET și POST către aceeași adresă URL funcționează bine. Pot schimba codul pentru API-ul REST ca o soluție, dar înțeleg că PATCH este mai mult "corect" pentru modul în care folosim cererea în API.
Cateva detalii:
Se pare că Apache blochează solicitarea înainte de a ajunge la API-ul REST personalizat. Pot vedea atât cererile PATCH, cât și GET în jurnalele de acces Apache, dar numai cererea GET apare în jurnalul personalizat API REST (FWIW, API-ul REST personalizat este implementat în Balon) folosind Gunicorn ca server de gazduire.
Exemple de înregistrări de jurnal de acces Apache:
192.168.0.1 - necunoscut [27/Aug/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 - administrator [27/Aug/2021:18:23:43 +0000] „GET /admin-api/services/12872 HTTP/1.1” 200 988 „-”...
Un lucru pe care l-am observat este că cererea PATCH înlocuiește numele de utilizator cu „necunoscut”. Acest lucru m-a făcut să cred că ceva nu era în regulă cu CORS. am gasit un "Antet" configurație care lipsea OPȚIUNI și PATCH, așa că le-am adăugat. Încă văd aceeași problemă. Mai jos este configurația actuală a opțiunii:
Antetul setat întotdeauna Access-Control-Allow-Methods „POST, GET, OPTIONS, PATCH”
Nu văd solicitări de OPȚIUNI înainte de zbor în jurnalele Apache sau în fereastra consolei browserului. Am încercat cu Google Chrome (92.0) și Firefox (91.0).
Solicitările PATCH au antetul „access-control-allow-origin” setat la „POST, GET, OPTIONS, PATCH”
Configurația proxy Apache folosește un socket Unix pentru a trimite proxy către Gunicorn:
<Location /admin-api>
ProxyPass unix:/run/admin-api.sock|http://127.0.0.1
</Location>
Cerere de preluare JavaScript: (apiUrl
și id
sunt variabile setate mai devreme în funcție):
let resp = await fetch(`${apiUrl}/services/${id}`, {
acreditări: „include”,
metoda: "PATCH",
antete: {
„Content-Type”: „aplicație/json”,
Accept: „application/json”,
},
body: JSON.stringify({
date: { min: 1, max: 3 },
}),
});
Apache versiunea 2.4.6. Știu că tehnic Socket-urile Unix au fost implementate în 2.4.7, dar toate celelalte funcționalități funcționează. De asemenea, am încercat să trec la porturi „obișnuite”, dar obțin același rezultat.