2015-07-25 7 views
0

Я пытаюсь сделать запрос с XMLHttpRequest из файла: //example.html до http://localhost/index.php. Я много читал о CORS (в этом случае origin имеет значение null, это нормально.) И я понятия не имею, что я делаю неправильно. Мой запрос хорошо завершен, но $ _POST пуст! За исключением случаев, когда я установил «Content-type: application/x-www-form-urlencoded». Но «text/plain» или «application/json» не дает результата в $ _POST ... Почему?CORS: не может получить тело запроса POST.

xhr.open("POST", "http://localhost/index.php", true); 
    xhr.setRequestHeader("Content-Type", "application/json"); 
    xhr.onreadystatechange = handler; 
    xhr.send({'a':'12'}); 

ответ

3

Вы, вероятно, делает один из этих двух вещей неправильно:

Если тип содержимого не application/x-www-form-urlencoded, CORS должен послать запрос предполетной. Это означает, что браузер отправит перед выполнением запроса POST запрос OPTIONS, который используется для определения того, разрешен ли запрос POST. Посмотрите here, как это работает.

Во-вторых, если вы используете xhr.setRequestHeader("Content-Type", "application/json"), параметры $_POST не будут заполнены параметрами, это относится только к приложению/x-www-form-urlencoded. Чтобы получить JSON вы отправляете, вы должны сделать:

<?php 
    $input = json_decode(file_get_contents("php://input"), true); 
    echo $input['a']; //echoes: 12 

Для получения дополнительной информации см this вопрос.

Кроме того, если вы входите в средства для отладки любого приличного браузера, оно создаст сообщение об ошибке, если запрос CORS не будет разрешен, пожалуйста, проверьте, действительно ли запрос CORS был сделан браузером.

Надеюсь, это вам поможет.

+0

Большое спасибо, это действительно помогло! –

1

дополняющие @ ответ user23127 сторона

сервер должен иметь что-то вроде этого, чтобы ответить на OPTIONS предполетной запросу:

if (request.method === 'OPTIONS') { 
    htmlRes = HttpResponse() 
    htmlRes['Access-Control-Allow-Origin']='*' // or your not origin domain 
    htmlRes['Access-Control-Allow-Methods']='*' // or POST, GET, PUT, DELETE 
    htmlRes['Access-Control-Allow-Headers']='*' // Content-Type, X-REQUEST 
} 
// the rest of the code as if it was not a CORS request 
Смежные вопросы