web-dev-qa-db-fra.com

Comment accéder au corps d'un WP Demande d'API dans un itinéraire personnalisé?

J'ai créé un itinéraire personnalisé dans WP API (v2 bêta 4) pour définir une option de site. J'utilise AngularJS pour effectuer l'appel API et, pour une raison quelconque, je ne suis pas en mesure d'accéder aux données envoyées dans la demande. Voici ce que j'ai jusqu'à présent:

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
                    }  
         })

    }

}]);

Cela envoie avec succès la demande et les données postées ressemblent à ceci:

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

La demande parvient avec succès à mon itinéraire personnalisé et au rappel que j'ai spécifié. Voici cette fonction de rappel dans la classe:

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', __( 'Cannot update option.' ), array( 'status' => 400 ) );
    }

}

Le problème est que cela échoue toujours et renvoie WP_Error car $ request ['option'] est null.

Quand je var_dump ($ request), je vois la chaîne JSON dans la partie ['body'] de l'objet, mais cela ne me permet pas d'y accéder lorsque j'appelle cette partie du tableau. J'ai également essayé d'utiliser les méthodes de récupération des paramètres indiqués dans la documentation ( http://v2.wp-api.org/extending/adding/ ), mais aucune de ces méthodes ne semble renvoyer les données. Est-ce que je manque quelque chose de vraiment basique ici?

8
Ryan Hale

Vous pouvez utiliser $request->get_body()

4
Gerardlamo

Vous pouvez utiliser $request->get_json_params() qui retournera un tableau de clés => valeurs.

Avec ces conditions (éventuellement un peu plus):

  1. Le client qui envoie la demande a Content-Type: application/json dans l'en-tête.
  2. Il y a un corps brut comme {"option":"siteColor","value":"ff0000"}.

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

3
mkly

Dans un réponse précédente a pu accéder aux données dans un point de terminaison personnalisé en utilisant

$parameters = $request->get_query_params(); 

Vérifiez les paramètres de la requête pour option

$parameters['option']

<?php
function my_awesome_func( WP_REST_Request $request ) {
    // You can access parameters via direct array access on the object:
    $param = $request['some_param'];

    // Or via the helper method:
    $param = $request->get_param( 'some_param' );

    // You can get the combined, merged set of parameters:
    $parameters = $request->get_params();

    // The individual sets of parameters are also available, if needed:
    $parameters = $request->get_url_params();
    $parameters = $request->get_query_params();
    $parameters = $request->get_body_params();
    $parameters = $request->get_default_params();

    // Uploads aren't merged in, but can be accessed separately:
    $parameters = $request->get_file_params();
}
3
jgraup