Enregistreur pour les demandes SOAP


Réponses:


2

Je vais mordre depuis que je l'ai fait récemment, c'était un service d'API REST cependant, mais quelque chose de similaire pour une demande SOAP est sûrement possible. Donc, au lieu de détails, en particulier juste un aperçu du processus que j'ai suivi:

1) CRÉER UN MODÈLE DE RESSOURCES

Tout d'abord, vous voudrez créer un nouveau modèle de ressource Magento, il existe de nombreux exemples pour:

Voici un exemple du tableau que je crée lors de l'installation de mes modules (évidemment, adaptez-le à vos besoins / exigences).

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;

Remarque: J'ai également débattu du stockage du XML de demande et de réponse dans un format gzip pour conserver l'espace db, et XML se comprime bien. Cependant, la grille adminhtml de Magento aurait besoin d'un moteur de rendu personnalisé, donc j'ai gardé le XML stocké tel quel pour l'instant.

2) DEMANDE DE CURL DE REPOS GÉNÉRIQUE VIA PHP

J'utilise généralement une seule classe, par exemple: Rest.php avec quelque chose de similaire pour les appels d'API rapides et indolores via CURL dans mon module. Je pense que les options lib / Varien et Zendframework peuvent également être prises en compte, mais j'ai eu beaucoup de succès avec ce petit extrait facile à lire:

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

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

J'utilise également une autre bibliothèque distincte appelée Array2XML pour créer mes POSTdemandes à utiliser avec ce simple extrait de demande 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()) {

Voici un exemple d'utilisation de ma classe Rest.php: (NOTE: $restUrl, $apiKeysont entraînés de configuration).

// 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) AJOUTER LA CONNEXION AUX DEMANDES / RÉPONSES

Enveloppez ensuite votre modèle de ressource nouvellement créé autour des Rest.phpappels pour collecter des données avant et après un retour de l'API tierce.

Quelque chose comme ça avant curl_exec :

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

...

Et après le 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();
    }

Au lieu de simplement renvoyer l'objet cURL, j'utilise SimpleXMLElement ($ response) pour convertir la réponse des API en XML.

Un try/ catchavec un $logModel->save();et un Mage::logException($e);dans le Rest.php peut mieux aider à déboguer tout problème avec l'intégration. Étant donné que les exceptions fatales seront toujours partiellement enregistrées dans votre modèle de ressource, mais apparaissent également dansvar/log/excpetions.log

4) ADMIN HTML GRID

Créez maintenant simplement une nouvelle grille adminhtml Magento personnalisée dans votre table contenant les données du journal.

Mon clic sur les éléments de ligne de la grille va dans le détail pour la demande unique avec les données XML de réponse et de demande, car l'affichage de ce grand nombre de données sur la grille peut être problématique.

REMARQUES

Ajoutez toujours une option Système -> Configuration pour activer / désactiver la journalisation car avec un grand nombre de requêtes passant par la communication API, la table peut devenir assez lourde et affecter les performances. Je désactiverai normalement la journalisation une fois que l'intégration aura fonctionné correctement pendant un certain temps.

Idéalement, vous pouvez tirer parti de Mage_Log et simplement ajouter votre table personnalisée à sa liste de tables à élaguer à intervalles pour la garder mince, mais je ne suis pas sûr de la procédure appropriée pour des champs de date / heure spécifiques, par exemple.

Vous pouvez également envisager d'utiliser des attributs personnalisés pour stocker vos données relationnelles entre Magento et l'API tierce.

Espérons que cela aide dans une direction générale à éliminer les piqûres des intégrations tierces. Comme toutes les exigences ne sont jamais les mêmes. Cela dit, cependant, un mécanisme de journalisation API généralisé peut être bénéfique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.