Почему я не могу загрузить XMLHttpRequest — Ответ предполетного полета не выполнен Ошибка только с методом Delete?

Файл ресурсов PHP:

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST, DELETE, OPTIONS, GET, PUT");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

require_once ("center_service.php");

$data = json_decode(file_get_contents("php://input"));
$method = $_SERVER['REQUEST_METHOD'];

if (!isset($routes[2])) {
$sql = "SELECT * FROM centers;";
Center::readCenter($sql);
} else if (isset($routes[2]) && is_numeric($routes[2]) && $method === "GET") {
$sql = "SELECT * FROM centers WHERE id='$routes[2]';";
Center::readCenter($sql);
} else if (isset($routes[2]) && is_numeric($routes[2]) && $method === "DELETE") {
Center::deleteCenter($routes[2]);
}
else {
header('HTTP/1.0 404 Not Found');
require '404.php';
}

Угловой сервисный файл:

readonly ROOT_URL = 'http://localhost/ecdweb/api/index.php';

getCenters(): Observable<Center[]> {
return this.http.get<Center[]>(this.ROOT_URL + '/centers');
}
deleteCenter(id: number): Observable<{}> {
return this.http.delete(this.ROOT_URL + '/centers/' + id);
}

Метод get работает и возвращает результаты, но не работает с методом delete. Если это из-за CORS, то почему метод get работает?

Журнал консоли:
введите описание изображения здесь

Сеть:
введите описание изображения здесь

Смежные вопросы:

Ошибка «XMLHttpRequest не может загрузить файл: ///… предпечатная проверка не удалась»

Предпечатная реакция не удалась

Экспресс-сервер и Axios CORS Preflight ответ не прошел

0

Решение

Хорошо, я думаю, это потому, что если метод отличается от GET или DELETE, вы возвращаете 404. Поэтому, когда обрабатывается предпечатный запрос (глагол OPTIONS), вы возвращаете 404.

Вот пример CORS в PHP (Вот)

Основная тема:

Важным моментом здесь является то, что сценарий API должен распознавать, когда был получен первоначальный запрос OPTIONS, и возвращать соответствующие заголовки контроля доступа в этом случае (и ничего более). После этого браузер затем инициирует второй запрос, в котором выполняется настоящая работа.

В вашем конкретном случае я думаю, что код должен быть:

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers');
exit;
}

Если вы хотите включить Cors более глобально, вы можете просто добавить

header('Access-Control-Allow-Origin: *');

в вашем PHP-скрипте (посмотреть здесь)

0

Другие решения

Других решений пока нет …