Cum accesez corpul unei cereri WP API într-o rută personalizată?

18 nov. 2015, 19:09:26
Vizualizări: 34.6K
Voturi: 17

Am creat o rută personalizată în WP API (v2 beta 4) pentru a seta o opțiune de site. Folosesc AngularJS pentru a face apelul API și din anumite motive nu pot accesa datele trimise în cerere. Iată ce am până acum:

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

    }

}]);

Aceasta trimite cu succes cererea iar datele postate arată cam așa:

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

Cererea ajunge cu succes la ruta mea personalizată și la callback-ul pe care l-am specificat. Iată funcția callback din clasă:

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

}

Problema este că aceasta eșuează întotdeauna și returnează WP_Error deoarece $request['option'] este null.

Când folosesc var_dump($request), văd șirul JSON în porțiunea ['body'] a obiectului, dar nu-mi permite să accesez acea parte când apelez acea porțiune a array-ului. Am încercat de asemenea să folosesc metodele pentru recuperarea parametrilor menționate în documentație (http://v2.wp-api.org/extending/adding/), dar niciuna dintre acestea nu pare să returneze datele. Am ratat ceva elementar aici?

1
Comentarii

ai avut noroc cu asta?

jgraup jgraup
24 nov. 2016 03:48:05
Toate răspunsurile la întrebare 3
1
12

Poți folosi $request->get_json_params() care va returna un array de tip cheie => valoare.

Cu următoarele condiții (posibil și altele):

  1. Clientul care trimite cererea are în header Content-Type: application/json
  2. Există un body raw de tipul {"option":"siteColor","value":"ff0000"}.

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

28 feb. 2019 23:56:46
Comentarii

Exact asta cautam. Mulțumesc!

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

Într-un răspuns anterior am reușit să accesez datele într-un endpoint personalizat folosind

$parameters = $request->get_query_params(); 

Verifică parametrii query pentru option

$parameters['option']

Două opțiuni pentru a obține body-ul request-ului:

$body = $request->get_body();

$body_params = $request->get_body_params();

Exemplu

<?php
function my_awesome_func( WP_REST_Request $request ) {

    // Două modalități de a obține body-ul din request.
    $body = $request->get_body();
    $body_params = $request->get_body_params();

    // Poți accesa parametrii prin accesarea directă a array-ului pe obiect:
    $param = $request['some_param'];

    // Sau prin metoda helper:
    $param = $request->get_param( 'some_param' );

    // Poți obține setul combinat de parametri:
    $parameters = $request->get_params();

    // Seturile individuale de parametri sunt de asemenea disponibile, dacă e nevoie:
    $parameters = $request->get_url_params();
    $parameters = $request->get_query_params();
    $parameters = $request->get_default_params();

    // Upload-urile nu sunt incluse, dar pot fi accesate separat:
    $parameters = $request->get_file_params();
}
17 dec. 2015 06:36:57
0

Puteți folosi $request->get_body()

17 mar. 2017 11:37:29