Domanda

Ho impostato un percorso personalizzato funzionante per API di riposo di Magento.

Funziona bene per ottenere richieste, poiché la funzione _retrieve() della corrispondente classe V1.php viene chiamata come previsto e restituisce i dati. Ma ora sto cercando di gestire le richieste post e questo è quando magento si sta comportando strano:

    .
  • Quando si desidera pubblicare i dati è necessario definire i dati come raccolta invece di un'entità in etc/api2.xml come questa: <action_type>collection</action_type>. Altrimenti Magento lancerà questo errore in Mage_Api2_Model_Resource (linea 207):
    // Creation of objects is possible only when working with collection
    $this->_critical(self::RESOURCE_METHOD_NOT_IMPLEMENTED);
    
    .

    Quindi quando definisco l'azione_type come raccolta, la funzione _multiCreate() del corrispondente V1.php viene chiamata come previsto.

      .
    • Tuttavia magento ora non mi permette di restituire dati. Voglio restituire questo array in formato JSON:

      $response = array("success"=>true, "error"=>"", "model"=>array(1,2,3));

      "Successo", "Errore" e "Modello" sono definiti come attributi nell'API2.xml e dovrebbero pertanto essere disponibili. Ma quando restituisco $response, la risposta è vuota con Stato 207 ... Hmmm! Ora poiché ha una collezione Action_type, ho anche provato a restituire il $response avvolto all'interno di un altro array, ma senza successo.

      Nelle mie prove finali ho capito che impostando i dati con il metodo $this->getResponse()->addMessage(....) sono in grado di recuperare i dati, ma non penso che questo sia il modo corretto come è pensato per il successo / errore / messaggio di avviso Tipi e non si adatta ai miei requisiti del tipo di dati

      Ultimo ma non meno importante Ho anche provato a restituire i dati utilizzando i metodi $this->getResponse()->setBody($result) e $this->getResponse()->setRawBody($result), ma di nuovo - Nessun successo:

      Allora esperti magentali - Qual è il modo corretto per recuperare i dati da una richiesta post all'API di riposo? Ho disperatamente bisogno del tuo aiuto !!

      Ecco il mio api2.xml:

      <customer_login translate="title" module="Test_Restapi">
          <group>restapi</group>
          <model>restapi/api2_customer_login</model>
          <title>Blablabla</title>
          <sort_order>10</sort_order>
          <privileges>
              <customer>
                  <create>1</create>
                  <update>1</update>
                  <retrieve>1</retrieve>
              </customer>
              <guest>
                  <create>1</create>
                  <update>1</update>
                  <retrieve>1</retrieve>
              </guest>
          </privileges>
          <attributes>
              <success>Success</success>
              <error>Error</error>
              <model>Model</model>
          </attributes>
          <routes>
              <route_collection>
                  <route>/restapi/customer/login</route>
                  <action_type>collection</action_type>
              </route_collection>
          </routes>
          <versions>1</versions>
      </customer_login>
      
      .

È stato utile?

Soluzione

Se si danno un'occhiata alla classe Mage_Api2_Model_Resource che dovrebbe essere estesa dalla tua classe, è possibile trovare la funzione _render().

Esaminando la funzione dispach() di questa classe, è possibile visualizzare che la funzione _render() viene chiamata recuperando le operazioni.Quindi puoi usare questa funzione alla fine della tua azione come così $this->_render($data).

Questa funzione non viene utilizzata da operazioni Creazione, che imposta solo l'intestazione della posizione per l'URL della risorsa nuovamente creata.

Per sfruttare il filtro dell'attributo, utilizzare $this->getFilter()->out($data) prima di $this->_render($data)

Mage_Api2_Model_Resource::dispatch() può rispondere a molte domande riguardanti il riposo Magento!

Altri suggerimenti

Sono riuscito a recuperare i dati dalla funzione _createMulti() seguendo i suggerimenti @ Raivis.krumins.All'interno della funzione dispatch() della classe Mage_Api2_Model_Resource ho aggiunto queste 3 linee dopo la riga 228 alla fine dell'istruzione if in cui viene impostata l'intestazione della posizione:

$retrievedData = $this->_createMulti($filteredData);
$returnData  = $this->getFilter()->out($retrievedData);
$this->_render($returnData);
.

La prima riga recupera il risultato dalla funzione, la seconda riga filtra gli attributi indesiderati (quelli non impostati in api2.xml) e infine la terza riga restituisce i dati nella risposta.

Si prega di notare che queste modifiche dovrebbero sempre essere effettuate in un modulo personalizzato.Non cambiare mai una classe principale!

Poco prima di reinserire il set di funzioni del modulo personalizzato

$ questo-> getriponse () -> appendbody (json_code ($ risposta));

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top