0

Tengo un archivo PHP donde solo quiero obtener el valor de una variable de una petición http la cual se llama method y la quiero mostrar mediante echo. Suena tan simple pero no funciona. Este es mi código:

<?php
  header('Content-Type: application/json');
  header('Access-Control-Allow-Origin: *');
  header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
  header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
  header("Allow: GET, POST, OPTIONS, PUT, DELETE");

  
  $method = $_POST["method"];

  
  echo json_encode(["response" => $method]);
?>

Como se puede notar ya le agregué headers innecesarios pero sigue sin funcionar. Estoy utilizando XAMP y postman para ver el resultado de la siguiente petición.

http://localhost/Crud/backend.php?method=insertar

Y este es el resultado, en el ejemplo viene que el error está en la linea 4 pero eso es cuando quito los headers, en el código anterior vendría linea 9

introducir la descripción de la imagen aquí

Para este ejemplo hago una petición con el siguiente código utilizado angular 2+

this.http.post<any>("http://localhost/Crud/backend.php", {
      "method" : "getCategories"
    }).subscribe(data => {
      console.log("respuesta", data);
    });

No se, tal vez el error se origina desde ahí

Aleex
  • 105
  • 5
  • Como indica BetaM, solo debes cambiar $method = $_POST["method"] por $method = $_GET["method"], ya que es la forma en la que estas pasando el parametro. – DarkFrost Jun 16 '20 at 03:24
  • gracias por responder, les explico, tengo una aplicación en angular que necesita hacer una petición al servidor, le mando muchos datos entre ellos method y para este ejemplo solo utilicé ese, en la url es solo para que vean más o menos que trae en el post, pero al parecer aunque haga la petición con jquery o angular el resultado es el mismo. Lo curioso es que cuando le pongo $_GET si funciona aunque la petición sea POST o GET. Actualizo la pregunta con la función de angular. – Aleex Jun 16 '20 at 03:45
  • Si no te importa por donde viene la variable puedes usar $_REQUEST , en vez de los arreglos $_POST y $_GET, no sé angular pero en JSON no existen cosas como {"method" : "getCategories"} existen {method : "getCategories"} es decir el nombre de la variable no viene entre comillas, el valor es el que viene entre comillas. – Tabitha Jun 16 '20 at 04:12
  • gracias por responder, modifiqué lo de las comillas y aun así no funciona, tambien utilicé $_REQUEST pero solo funciona cuando hago una petición GET, con POST sigue igual, hice una prueba en postman poniendo el valor de method en la pestaña de body en la opción x-www-from-urlencoded y ahí si me funciona haciendo una petición POST y recibiendo los datos con $_POST, tal vez se tiene que hacer una configuración extra en el lado de angular, voy a intentar hacerlo con jquery y javascript puro. – Aleex Jun 16 '20 at 04:49
  • @Tabitha de hecho en una estructura JSON válida las claves si que van entre comillas, sino lo que le estás recomendando es un objeto y eso es algo distinto – BetaM Jun 16 '20 at 04:53
  • JSON son objetos, el acrónimo es JavaScript Object Notation, claro que estoy recomendando un objeto, ya que un objeto dentro de un código de JavaScript es lo que se está agregando como parámetro a la función. La base es sin comillas dobles, si después programadores de otros lenguajes que no saben de JavaScript le quisieron poner comillas dobles para entenderlo ya fue diferente. – Tabitha Jun 16 '20 at 05:23
  • Yo finalizó @Tabitha recomendandote este recurso https://es.stackoverflow.com/questions/164943/cu%c3%a1l-es-la-diferencia-entre-json-y-un-objeto-en-javascript/164944#164944 – BetaM Jun 16 '20 at 05:28
  • @BetaM creo que si el código de javascript JSON.parse() regresa un objeto de JavaScript es totalmente válido llamar JSON a un objeto de JavaScript – Tabitha Jun 16 '20 at 06:24

1 Answers1

0

Encontré la solución del problema más no se por qué no funciona de la forma anterior con angular 2.

<?php
  header('Content-Type: application/json');
  header('Access-Control-Allow-Origin: *');
  header("Access-Control-Allow-Headers: Content-Type");
  $json = file_get_contents('php://input');
  $params = json_decode($json);
  echo json_encode(["method" => $params->method]);
?>

En vez de utilizar $method = $_POST["method"]; utilicé $json = file_get_contents('php://input'); para que me traiga todos los datos que mandé desde el front-end en string con formato JSON, pero para utilizar los datos es necesario convertir $json a variable de PHP con json_decode($json);. En el ejemplo solo quería devolver lo que mandé, pero $_POST no quería reconocerme el parámetro.

Más detalles y la solución la encontré en https://www.tutorialesprogramacionya.com/angularya/detalleconcepto.php?punto=28&codigo=28&inicio=20

Aleex
  • 105
  • 5