Nessuna risposta dal post sul percorso API di riposo personalizzato
-
12-12-2019 - |
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 inMage_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 corrispondenteV1.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 datiUltimo 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>
-
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));