Come accedere al corpo di una richiesta WP API in una route personalizzata?

18 nov 2015, 19:09:26
Visualizzazioni: 34.6K
Voti: 17

Ho creato una route personalizzata in WP API (v2 beta 4) per impostare un'opzione del sito. Sto usando AngularJS per effettuare la chiamata API, ma per qualche motivo non riesco ad accedere ai dati inviati nella richiesta. Ecco quello che ho finora:

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

    }

}]);

Questo invia con successo la richiesta e i dati inviati appaiono più o meno così:

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

La richiesta arriva con successo alla mia route personalizzata e alla callback che ho specificato. Ecco la funzione di callback all'interno della 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', __( 'Impossibile aggiornare l\'opzione.' ), array( 'status' => 400 ) );
    }

}

Il problema è che questo fallisce sempre e restituisce WP_Error perché $request['option'] è null.

Quando eseguo var_dump($request), vedo la stringa JSON nella parte ['body'] dell'oggetto, ma non mi permette di accedervi quando chiamo quella parte dell'array. Ho anche provato a utilizzare i metodi per recuperare i parametri indicati nella documentazione (http://v2.wp-api.org/extending/adding/), ma nessuno di questi sembra restituire i dati. Mi sta sfuggendo qualcosa di veramente basilare?

1
Commenti

qualche fortuna con questo?

jgraup jgraup
24 nov 2016 03:48:05
Tutte le risposte alla domanda 3
1
12

Puoi utilizzare $request->get_json_params() che restituirà un array di chiave => valori.

Con queste condizioni (possibilmente alcune in più):

  1. Il client che invia la richiesta ha Content-Type: application/json nell'header
  2. C'è un body raw come {"option":"siteColor","value":"ff0000"}.

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

28 feb 2019 23:56:46
Commenti

Questo è esattamente quello che stavo cercando. Grazie!

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

In una risposta precedente ho potuto accedere ai dati in un endpoint personalizzato utilizzando

$parameters = $request->get_query_params();

Controlla i parametri della query per option

$parameters['option']

Due opzioni per ottenere il corpo della richiesta:

$body = $request->get_body();

$body_params = $request->get_body_params();

Esempio

<?php
function my_awesome_func( WP_REST_Request $request ) {

    // Due modi per ottenere il corpo dalla richiesta.
    $body = $request->get_body();
    $body_params = $request->get_body_params();

    // Puoi accedere ai parametri tramite accesso diretto all'array sull'oggetto:
    $param = $request['some_param'];

    // Oppure tramite il metodo helper:
    $param = $request->get_param( 'some_param' );

    // Puoi ottenere l'insieme combinato e unito dei parametri:
    $parameters = $request->get_params();

    // I singoli set di parametri sono anch'essi disponibili, se necessari:
    $parameters = $request->get_url_params();
    $parameters = $request->get_query_params();
    $parameters = $request->get_default_params();

    // Gli upload non sono uniti, ma possono essere accessi separatamente:
    $parameters = $request->get_file_params();
}
17 dic 2015 06:36:57
0

Puoi utilizzare $request->get_body()

17 mar 2017 11:37:29