Logger per richieste SOAP


Risposte:


2

Ti morderò da quando l'ho fatto di recente, è stato comunque un servizio API REST, ma è sicuramente possibile qualcosa di simile per una richiesta SOAP. Quindi, invece di dettagli, in particolare solo una panoramica del processo che ho preso:

1) CREA UN MODELLO DI RISORSE

Per prima cosa vorrai creare un nuovo modello di risorse Magento, ci sono molti esempi disponibili per questo:

Ecco un esempio della tabella che sto creando durante l'installazione dei miei moduli (ovviamente adattandola alle tue esigenze / esigenze).

CREATE TABLE IF NOT EXISTS mynamespace_mymodulename_logs (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp` datetime NOT NULL,
  `requestUrl` varchar(255) DEFAULT NULL,
  `method` varchar(10) DEFAULT NULL,
  `returnHttpCode` varchar(10) DEFAULT NULL,
  `returnError` TEXT NOT NULL,
  `requestXML` TEXT NOT NULL,
  `responseXML` TEXT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Nota: ho anche discusso della memorizzazione della richiesta e della risposta XML in un formato gzip per conservare lo spazio db e XML si comprime bene. Tuttavia la griglia adminhtml di Magento avrebbe bisogno di un renderer personalizzato, quindi per ora ho mantenuto l'XML così com'è.

2) RICHIESTA DI CURL DI RIPOSO GENERICO VIA PHP

In genere uso una sola classe, ad esempio: Rest.php con qualcosa di simile per chiamate API veloci e indolori tramite CURL nel mio modulo. Credo che anche le opzioni lib / Varien e Zendframework possano essere qualcosa da considerare, tuttavia ho avuto un grande successo con questo piccolo frammento di facile lettura:

<?php
$url = 'https://www.google.com';
$method = 'POST';

# headers and data (this is API dependent, some uses XML)
$headers = array(
    'Accept: application/json',
    'Content-Type: application/json',
);
$data = json_encode(array(
    'firstName'=> 'John',
    'lastName'=> 'Doe'
));

$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);

switch($method) {
    case 'GET':
        break;
    case 'POST':
        curl_setopt($handle, CURLOPT_POST, true);
        curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
        break;
    case 'PUT': 
        curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
        break;
    case 'DELETE':
        curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'DELETE');
        break;
}

$response = curl_exec($handle);
$code = curl_getinfo($handle, CURLINFO_HTTP_CODE);

Fonte: http://singletonio.blogspot.com/2009/07/simple-php-rest-client-using-curl.html

Uso anche un'altra libreria separata chiamata Array2XML per creare le mie POSTrichieste da utilizzare con questo semplice frammento di richiesta REST.

 * @param type $method
 * @param type $data
 * @param type $url
 * @param type $header
 * @param type $topNode
 * @return boolean|xml
 */
public function RESTRequest($method, $url, $header, $data = array(), $topNode = array()) {

Ecco un esempio di utilizzo della mia classe Rest.php: (NOTA: $restUrl, $apiKeysono guidati dalla configurazione).

// Available Invetory Product
$requestUrl = $restUrl . "inventory/item/test/111/111";
$inventory = Mage::getModel('mynamespace/mymodulename')->RESTRequest('GET', '', $requestUrl, $apiKey);
//zend_debug::dump($inventory->inventory_item->quantity_on_hand);
header("Content-Type: text/xml");
echo $inventory->asXML();
exit;

3) AGGIUNGI LOGGING A RICHIESTE / RISPOSTE

Quindi avvolgi il tuo modello di risorsa appena creato attorno Rest.phpalle chiamate per raccogliere dati prima e dopo che è stato effettuato un ritorno dall'API di terze parti.

Qualcosa del genere prima curl_exec :

    if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
        $logModel->setData('timestamp', time())
                ->setData('requestUrl', $url)
                ->setData('method', $method)
                ->setData('requestXML', @$postFields);
    }

...

E dopo il curl_exec:

    $xmlResponse = new SimpleXMLElement($response);

    if ($xmlResponse->error) {
        $logModel->setData('returnError', $xmlResponse->error->error_description);
    }

    if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
        $logModel->setData('returnHttpCode', $code)
                ->setData('responseXML', $xmlResponse->asXML())
                ->save();
    }

Invece di restituire semplicemente l'oggetto cURL, utilizzo SimpleXMLElement ($ response) per convertire la risposta API in XML.

A try/ catchwith a $logModel->save();e a Mage::logException($e);in Rest.php possono aiutare a debug di eventuali problemi con l'integrazione. Poiché le eccezioni fatali verranno comunque parzialmente registrate nel modello di risorsa ma verranno visualizzate anche invar/log/excpetions.log

4) ADMIN HTML GRID

Ora crea semplicemente una nuova griglia adminhtml Magento personalizzata sulla tua tabella contenente i dati del registro.

Il mio clic sugli elementi pubblicitari della griglia diventa dettagliato per la singola richiesta con i dati XML di risposta e richiesta in quanto la visualizzazione di tali dati sulla griglia può essere problematica.

APPUNTI

Aggiungi sempre un'opzione Sistema -> Configurazione per attivare / disattivare la registrazione poiché con un gran numero di richieste che passano attraverso la comunicazione API, la tabella può diventare piuttosto pesante e influire sulle prestazioni. Normalmente disabiliterò la registrazione dopo che l'integrazione ha funzionato correttamente per un po '.

Idealmente, potresti sfruttare Mage_Log e aggiungere semplicemente la tua tabella personalizzata al suo elenco di tabelle da potare su intervalli per mantenerla snella, tuttavia non sono sicuro della procedura corretta per campi specifici di data / ora.

Puoi anche considerare l'utilizzo di attributi personalizzati per archiviare i tuoi dati relazionali tra Magento e l'API di terze parti.

Speriamo che questo aiuti in una direzione generale di eliminare le integrazioni di terze parti. Poiché non tutti i requisiti sono sempre gli stessi. Detto questo, tuttavia, può essere utile un meccanismo di registrazione API generalizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.