¿Cómo accedo al cuerpo de una solicitud de WP API en una ruta personalizada?

18 nov 2015, 19:09:26
Vistas: 34.6K
Votos: 17

He creado una ruta personalizada en WP API (v2 beta 4) para establecer una opción del sitio. Estoy usando AngularJS para hacer la llamada a la API y, por alguna razón, no puedo acceder a los datos enviados dentro de la solicitud. Esto es lo que tengo hasta ahora:

gvl.service('gvlOptionService', ['$http', function($http) {

    this.updateOption = function(option, value) {

        return $http({
          method  : 'POST',
          url     : wpAPIdata.gvlapi_base + 'options',
          data    : { "option" : option,
                      "value" : value
                    },
          headers : { 'Content-Type': 'application/x-www-form-urlencoded',
                      'X-WP-Nonce' : wpAPIdata.api_nonce
                    }  
         })

    }

}]);

Esto envía la solicitud exitosamente y los datos enviados se ven algo así:

{"option":"siteColor","value":"ff0000"}

La solicitud llega exitosamente a mi ruta personalizada y al callback que he especificado. Aquí está la función callback dentro de la clase:

public function update_option( WP_REST_Request $request ) {

    if(isset($request['option']) && $request['option'] == 'siteColor') {
        $request_prepared = $this->prepare_item_for_database($request);
        $color_updated = update_option('site_color', $request_prepared['value'], false);

        if($color_updated) {
            $response = $this->prepare_item_for_response('site_color');
            $response->set_status( 201 );
            $response->header('Location', rest_url('/gvl/v1/options'));
            return $response;
        } else {
            // ...
        }


    } else {
        return new WP_Error( 'cant_update_option', __( 'No se puede actualizar la opción.' ), array( 'status' => 400 ) );
    }

}

El problema es que esto siempre falla y devuelve el WP_Error porque $request['option'] es nulo.

Cuando hago var_dump($request), veo la cadena JSON en la parte ['body'] del objeto, pero no me permite acceder a ella cuando llamo a esa parte del array. También he intentado usar los métodos para recuperar parámetros mencionados en la documentación (http://v2.wp-api.org/extending/adding/), pero ninguno de ellos parece devolver los datos tampoco. ¿Me estoy perdiendo algo realmente básico aquí?

1
Comentarios

¿Alguna suerte con esto?

jgraup jgraup
24 nov 2016 03:48:05
Todas las respuestas a la pregunta 3
1
12

Puedes usar $request->get_json_params() que retornará un array de clave => valor.

Con estas condiciones (posiblemente algunas más):

  1. El cliente que envía la solicitud tiene Content-Type: application/json en la cabecera
  2. Hay un cuerpo en crudo como {"option":"siteColor","value":"ff0000"}.

https://developer.wordpress.org/reference/classes/wp_rest_request/get_json_params/

28 feb 2019 23:56:46
Comentarios

Esto es exactamente lo que estaba buscando. ¡Gracias!

Jason Ellis Jason Ellis
8 mar 2019 16:17:34
0
11

En una respuesta anterior pude acceder a los datos en un endpoint personalizado usando

$parameters = $request->get_query_params(); 

Verifica los parámetros de consulta para option

$parameters['option']

Dos opciones para obtener el cuerpo de la solicitud:

$body = $request->get_body();

$body_params = $request->get_body_params();

Ejemplo

<?php
function my_awesome_func( WP_REST_Request $request ) {

    // Dos formas de obtener el cuerpo de la solicitud.
    $body = $request->get_body();
    $body_params = $request->get_body_params();

    // Puedes acceder a los parámetros mediante acceso directo al array en el objeto:
    $param = $request['some_param'];

    // O mediante el método auxiliar:
    $param = $request->get_param( 'some_param' );

    // Puedes obtener el conjunto combinado de parámetros:
    $parameters = $request->get_params();

    // Los conjuntos individuales de parámetros también están disponibles, si es necesario:
    $parameters = $request->get_url_params();
    $parameters = $request->get_query_params();
    $parameters = $request->get_default_params();

    // Los archivos subidos no se combinan, pero se pueden acceder por separado:
    $parameters = $request->get_file_params();
}
17 dic 2015 06:36:57
0

Puedes usar $request->get_body()

17 mar 2017 11:37:29