Как захватить данные из запроса Ajax в PHP?
отправил data следующим образом:
this.httpClient.post(
this.url+'categorias/insertar',
{
"json": [
{
"nombre": this.categoria.nombre,
}
]
})
.subscribe(
data => {
console.log("POST Request is successful ", data);
},
error => {
console.log("Error", error);
}
);
это работает нормально, проблема в том, что в php мне не удается захватить json:
$app->post('/categorias/insertar', function() use($db, $app){
$json = $app->request->post('json');
$data = json_decode($json, true);
echo json_encode($data);
});
я выполняю var_dump($app->request)
и я получаю следующее:
В объекте вы можете заметить, что data прибывает, однако мне не удается захватить его.
object(Slim\Http\Request)[43]
protected 'env' =>
object(Slim\Environment)[37]
protected 'properties' =>
array (size=22)
'REQUEST_METHOD' => string 'POST' (length=4)
'REMOTE_ADDR' => string '::1' (length=3)
'SCRIPT_NAME' => string '/webapp-backend/index.php' (length=25)
'PATH_INFO' => string '/categorias/insertar' (length=20)
'QUERY_STRING' => string '' (length=0)
'SERVER_NAME' => string 'localhost' (length=9)
'SERVER_PORT' => string '80' (length=2)
'HTTP_HOST' => string 'localhost' (length=9)
'HTTP_CONNECTION' => string 'keep-alive' (length=10)
'CONTENT_LENGTH' => string '28' (length=2)
'HTTP_ACCEPT' => string 'application/json, text/plain, */*' (length=33)
'HTTP_ORIGIN' => string 'http://localhost:4200' (length=21)
'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' (length=114)
'CONTENT_TYPE' => string 'application/json' (length=16)
'HTTP_REFERER' => string 'http://localhost:4200/categoria' (length=31)
'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate, br' (length=17)
'HTTP_ACCEPT_LANGUAGE' => string 'es-419,es;q=0.9' (length=15)
'slim.url_scheme' => string 'http' (length=4)
'slim.input' => string '{"json":[{"nombre":"asda"}]}' (length=28)
'slim.errors' => resource(24, stream)
'slim.request.form_hash' =>
array (size=0)
...
'slim.flash' =>
object(Slim\Middleware\Flash)[19]
...
public 'headers' =>
object(Slim\Http\Headers)[44]
protected 'data' =>
array (size=10)
'Host' => string 'localhost' (length=9)
'Connection' => string 'keep-alive' (length=10)
'Content-Length' => string '28' (length=2)
'Accept' => string 'application/json, text/plain, */*' (length=33)
'Origin' => string 'http://localhost:4200' (length=21)
'User-Agent' => string 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' (length=114)
'Content-Type' => string 'application/json' (length=16)
'Referer' => string 'http://localhost:4200/categoria' (length=31)
'Accept-Encoding' => string 'gzip, deflate, br' (length=17)
'Accept-Language' => string 'es-419,es;q=0.9' (length=15)
public 'cookies' =>
object(Slim\Helper\Set)[46]
protected 'data' =>
array (size=0)
empty
1 answers
В зависимости от библиотеки, выполняющей requests, данные могут быть отправлены с различным content-type
.
JQuery по умолчанию отправляет request с header content-type: application/x-www-form-urlencoded;
, и поэтому Slim2 может захватить их с помощью
$json = $app->request->post('json');
Здесь нет необходимости делать json_decode
из того, что вы получаете. Сам по себе он парируется как массив.
httpClient
angular отправляет requests с content-type: application/json
, и поэтому данные поступают не в POST, а в payload body.
Когда вы отправляете данные в body, должен путешествовать как string, а не как объект. Тогда ваш запрос должен быть:
this.httpClient.post(
this.url+'categorias/insertar',
{
// conviertes el payload a un string
JSON.stringify("json": [
{
"nombre": this.categoria.nombre,
}
])
})
.subscribe(
data => {
console.log("POST Request is successful ", data);
},
error => {
console.log("Error", error);
}
);
И в бэкэнде:
$app->post('/categorias/insertar', function() use($db, $app){
$json = $app->request->getBody();
$data = json_decode($json, true);
echo json_encode($data);
});
Это ответит вам в основном так же, как вы отправили: {"json":[{"nombre":"<NOMBRE X>"}]}
.
Но если вы сделаете var_dump для $data
, он скажет вам, что это массив:
array(1) {
["json"]=>
array(1) {
[0]=>
array(1) {
["nombre"]=>
string(21) "<NOMBRE X>"
}
}
}