Я работаю над веб-приложением, которое взаимодействует с пользовательским API REST. По сути, это таблица данных, которая обновляется через приложение. я пытаюсь использовать ПЛАСТЫРЬ для обновлений, но Apache возвращает ошибку 404, когда я отправляю запрос.
Странно то, что запросы GET и POST к одному и тому же URL-адресу работают нормально. Я могу изменить код для REST API в качестве обходного пути, но, насколько я понимаю, PATCH больше "правильный" о том, как мы используем запрос в API.
Некоторые детали:
Похоже, что Apache блокирует запрос до того, как он попадет в пользовательский REST API. Я вижу запросы PATCH и GET в журналах доступа Apache, но в пользовательском журнале REST API отображается только запрос GET (FWIW, пользовательский REST API реализован в Колба) с использованием Гуникорн в качестве хостинг-сервера.
Пример записи журнала доступа Apache:
192.168.0.1 - неизвестно [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 - adminuser [27/Aug/2021:18:23:43 +0000] "GET /admin-api/services/12872 HTTP/1.1" 200 988 "-" ...
Одна вещь, которую я заметил, это то, что запрос PATCH заменяет имя пользователя на «неизвестно». Это заставило меня поверить, что что-то не так с CORS. я нашел "Заголовок" конфигурация, в которой отсутствовали ОПЦИИ и ИСПРАВЛЕНИЕ, поэтому я добавил их. Все еще вижу ту же проблему. Ниже приведена текущая конфигурация параметра:
Заголовок всегда устанавливает Access-Control-Allow-Methods "POST, GET, OPTIONS, PATCH"
Я не вижу предварительных запросов OPTIONS в журналах Apache или в окне консоли браузера. Я пробовал с Google Chrome (92.0) и Firefox (91.0).
Запросы PATCH имеют заголовок «access-control-allow-origin», установленный на «POST, GET, OPTIONS, PATCH».
Конфигурация прокси-сервера Apache использует сокет Unix для прокси-сервера Gunicorn:
<Location /admin-api>
ProxyPass unix:/run/admin-api.sock|http://127.0.0.1
</Location>
Запрос на выборку JavaScript: (apiUrl
и я бы
переменные, установленные ранее в функции):
let resp = await fetch(`${apiUrl}/services/${id}`, {
учетные данные: "включить",
метод: "ПАТЧ",
заголовки: {
"Тип контента": "приложение/json",
Принять: "приложение/json",
},
тело: JSON.stringify({
данные: {минимум: 1, максимум: 3},
}),
});
Апач версии 2.4.6. я знаю это технически Сокеты Unix были реализованы в 2.4.7, но все остальные функции работают. Я также пытался переключиться на «обычные» порты, но получил тот же результат.