JavaScript — PHP не получает тело POST, установленное в элементе Polymer core-ajax

Я создал элемент Polymer, используя core-ajax для отправки данных через POST в скрипт PHP.

<polymer-element name="login-process">
<template>
<core-ajax auto method="POST" id="login" url="/login.php" response="{{response}}">
</core-ajax>
<button on-tap={{doSend}}>send</button>
</template>
<script>
Polymer('login-process', {
ready: function() {
},
doSend: function() {
this.$.login.body = '{"foo": 1, "bar": 2}';
this.$.login.go();
},
responseChanged: function(oldValue) {
console.log(oldValue);
console.log(this.response);
}
})
</script>
</polymer-element>

Я проверил HTTP-запрос и убедился, что данные отправляются. тем не мение, мой PHP-скрипт — с другой стороны — не показывает следы данных в переменных $ _POST или $ _REQUEST. Это содержимое моего PHP-скрипта:

header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
header("Pragma: no-cache"); //HTTP 1.0
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

error_reporting(E_ALL);
ini_set("display_errors", 1);
define("BASE_PATH", $_SERVER['DOCUMENT_ROOT']);

define('WP_USE_THEMES', false);
global $wp, $wp_query, $wp_the_query, $wp_rewrite, $wp_did_header;
require(BASE_PATH . '/wp-load.php');var_dump($_POST);
var_dump($_REQUEST);

$creds = array();
$creds['user_login'] = 'example';
$creds['user_password'] = 'plaintextpw';
$creds['remember'] = true;
$user = wp_signon( $creds, false );

if ( is_wp_error($user) ) {
header("HTTP/1.0 401 Unauthorized");
echo $user->get_error_message();
exit();
}

header("HTTP/1.0 200 OK");

exit();

Не элегантный код, я знаю. Но ответ, который я получаю от сценария:

массив (0) {} массив (0) {} ОШИБКА: Неверное имя пользователя. Потерял
ваш пароль?

Таким образом, массивы $ _POST и $ _REQUEST пусты, когда я ожидаю, что они будут заполнены предоставленными мною данными.

1

Решение

в этом случае вы хотели бы использовать атрибут «params» this.$.login.params = '{"foo": 1, "bar": 2}'; вместо атрибута «тело». это позволит вам получить данные с помощью $ _POST. следующий план, который я использовал для другого ответа, показывающего, как я создаю форму в полимере, но также будет работать здесь, чтобы показать отправку данных $ _POST на сервер с php. http://plnkr.co/edit/JG7KKbMK0R1Fa1W2Gb4P?p=preview

1

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

Вот как я использую core-ajax для размещения некоторых данных:

в шаблоне:

<core-ajax
method="POST"id="core_ajax_el"on-core-response="{{ajax_get_responseHandler}}">
</core-ajax>

в прототипе:

    domReady: function(e) {

//set AJAX request params: they will be POSTed to the ajax-url.
var core_ajax_el = this.$.core_ajax_el;

// create the object literal
var aniArgs = {};
aniArgs['post_data'] = this.element_attribute;
core_ajax_el.params = aniArgs;

//set the AJAX URL
core_ajax_el.url = this.ajax_get_url;

//execute AJAX
core_ajax_el.go();

},

ajax_get_responseHandler: function(e, detail, sender) {
//do something with the response here

}
1

Поэтому я провел небольшое исследование и сделал несколько важных выводов.

core-ajax имеет свойство Тип содержимого который по дефолт установите для ‘application / x-www-form-urlencoded’.

Данные, которые я отправлял, были объектом json, и это было не URL-закодирован.

PHP заполняет $ _POST и $ _REQUEST когда это содержит URL-кодированный данные.
Далее, данные должны быть в форме ключ = значение [&ключ = значение …] пары, как с переменными запроса GET, для создания экземпляров индексов массива PHP.

Поэтому я мог бы отправить данные с помощью следующего кода:

this.$.login.body = 'data='+encodeURIComponent(JSON.stringify({"foo":1, "bar":2}));

Теперь в сценарии PHP:

echo $_POST['data'];  // outputs something like string(32) "{\"foo\":1, \"bar\":2}"
var $unescaped = stripslashes($_POST['data']);

echo $unescaped; // outputs string(29) "{"foo":1, "bar":2}"
$assoc_array = json_decode($unescaped, true); // now contains an assoc array of the
// json data

Тем не менее, я видел, как люди используют следующий код в своем скрипте PHP:

file_get_contents("php://input");

Это получает необработанные данные POST, отправленные на веб-сервер, независимо от того, закодирован ли он или нет.

Так что я могу так же легко продолжить отправку данных с:

this.$.login.body = '{"foo": 1, "bar": 2}';

и с PHP есть набор данных, используя:

$data = json_decode( file_get_contents( "php://input", true ) );
echo $data["foo"]; // outputs 1
1
По вопросам рекламы [email protected]