Как захватить данные из запроса 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
Author: A. Cedano, 2018-09-22

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>"
    }
  }
}
 4
Author: ffflabs, 2018-09-22 14:32:05