Не приходят данные с формы , ошибка Request header field Content-Type is not allowed by Access-Control-Allow-Headers

295
02 января 2018, 16:12

Изначально была ошибка:

Я ее исправил сначала добавив в Acess-Control....:'*' , отправил данные с формы но ,что в $_REQUEST , что в $_POST пусто. Дальше я попробовал сменить header на Origin, X-Requested-With, Content-Type, Accept, Authorization , все тоже самое ошибки нет, но $_POST $_REQUEST снова пустые. Как мне решить эту проблему? Вот сам обработчик:

<?
header('Content-type: json');
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

$theme = trim(htmlspecialchars($_POST["THEME"]));
$tel = trim(htmlspecialchars($_POST["TEL"]));
$email = trim(htmlspecialchars($_POST["EMAIL"]));
$msg = trim(htmlspecialchars($_POST["MESSAGE"]));
if ($_REQUEST["THEME"] == 'Не выбрано' || $_REQUEST["TEL"] == '' || $_REQUEST["EMAIL"] == '') {
    echo json_encode(
        array(
            "STATUS" => 'ERROR!',
            "REQ" => $_REQUEST
        )
    );
    die();

} else {
    $to = 'guscha.e@yandex.ru';
    $sub = 'Вопрос юристу';
    $fields = array($theme, $email, $msg);
    mail($to, $sub, 'Нужна помощь', $fields);
    echo json_encode(
        array(
            "THEME" => $theme,
            "TEL" => $tel,
            "EMAIL" => $email,
            "MESSAGE" => $msg,
            "STATUS" => 'OK',
            "REQ" => $_REQUEST

        )
    );
    die();

}

Вот ajax:

 ajaxFunc() {
    let form = document.querySelector('#order-jurist');
    let data = serialize(form, {hash: true});
    axios({
        method: 'post',
        url: 'http://военгарант.рф/api/jurist-order.php',
        data: data,
    })
        .then(res => {

            // console.log('ok');
            console.log(res);
            // console.log(item);

        })
        .catch(function (er) {
            console.log('error');
            console.log(er);
        });
    console.log(data);
}

Вот ответ от сервера:

file_get_contents("php://input"):

Answer 1

axios отправляет данные с заголовком header('Content-Type: application/json'), потому и данные не попадали в массив $_POST.

Есть два решения для POST запроса с помощью axios. Что бы отправлять на сервер данные нужного формата и с нужными заголовками.

axios({
    method: 'post',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    url: 'ajax.php',
    data: {
        firstName: 'Fred',
        lastName: 'Flintstone'
    }
})
.then(function(response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

Надо явно задать параметр headers: { 'Content-Type': 'application/x-www-form-urlencoded' }.

А это второй способ с применением URLSearchParams:

var params = new URLSearchParams();
params.append('firstName', 'Fred');
params.append('lastName', 'Flintstone');
axios({
    method: 'post',
    url: 'ajax.php',
    data: {params}
})
.then(function(response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

А здесь с помощью URLSearchParams создаем объект данных что бы отправить их в формате application/x-www-form-urlencoded а не JSON

Примечание: URLSearchParams не поддерживается всеми браузерами. Поддержку броузеров URLSearchParams можете смотреть здесь.

READ ALSO
AdBlock + ajax Не видит элемент

AdBlock + ajax Не видит элемент

На сайте с помощью

254
php не загружает несколько файлов

php не загружает несколько файлов

Есть вот такой код:

289
Mirror драйвера

Mirror драйвера

Задача состоит в получении изменённых областей экрана с большой скоростьюНасколько известно мне, для этого используются mirror драйвера

224
SFML C++ gif анимация

SFML C++ gif анимация

Доброго времени суток! С принципом создания анимации из изображения я знаком, а есть способы использовать gif для воспроизведения анимации...

360