Registrador para solicitudes SOAP


8

queremos conectar un socio de cumplimiento externo a Magento y queremos registrar sus solicitudes de API.

¿Hay algún registrador API gratuito y de código abierto disponible?


1
Encontré este pero no sé sobre el estado github.com/netz98/N98_ApiLogger
Alex

1
Estoy usando este módulo de Marko-M de Inchoo para registrar llamadas SOAP (v1 y v2 y wsi) github.com/Marko-M/Inchoo_SoapLogger
7ochem

Respuestas:


2

Morderé ya que recientemente hice esto, sin embargo, era un servicio API REST, pero seguramente es posible algo similar para una solicitud SOAP. Entonces, en lugar de detalles, particularmente solo una descripción general del proceso que tomé:

1) CREAR UN MODELO DE RECURSO

Primero querrás crear un nuevo modelo de recursos de Magento, hay muchos ejemplos para:

Aquí hay un ejemplo de la tabla que estoy creando durante la instalación de mis módulos (obviamente, adaptarla a sus necesidades / requisitos).

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: También debatí sobre el almacenamiento de la solicitud y la respuesta XML en un formato gzip para conservar el espacio db, y XML se comprime bien. Sin embargo, la cuadrícula adminhtml de Magento necesitaría un renderizador personalizado, por lo que mantuve el XML almacenado como está por ahora.

2) SOLICITUD DE RIZADO DE RESTO GENÉRICO VÍA PHP

Normalmente uso una sola clase, por ejemplo: Rest.php con algo similar para llamadas API rápidas e indoloras a través de CURL en mi módulo. Creo que las opciones lib / Varien y Zendframework también pueden ser algo a considerar, sin embargo, he tenido un gran éxito con este pequeño fragmento fácil de leer:

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

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

También uso otra biblioteca separada llamada Array2XML para compilar mis POSTsolicitudes que se utilizarán con este simple fragmento de solicitud 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()) {

Aquí es un ejemplo de uso de mi clase Rest.php: (NOTA: $restUrl, $apiKeyson expulsados de configuración).

// 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) AGREGAR REGISTRO A SOLICITUDES / RESPUESTAS

Luego, envuelva su modelo de recursos recién creado alrededor de las Rest.phpllamadas para recopilar datos antes y después de que se haya realizado una devolución desde la API de terceros.

Algo como esto antes curl_exec :

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

...

Y después del 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();
    }

En lugar de simplemente devolver el objeto cURL, uso SimpleXMLElement ($ response) para convertir la respuesta de las API a XML.

A try/ catchcon a $logModel->save();y a Mage::logException($e);en Rest.php puede ayudar mejor a depurar cualquier problema con la integración. Como excepciones fatales aún se registrarán parcialmente en su modelo de recurso, pero también aparecerán envar/log/excpetions.log

4) ADMINISTRAR HTML GRID

Ahora simplemente cree una nueva cuadrícula de Magento adminhtml personalizada en su tabla que contenga los datos de registro.

Mi clic en la cuadrícula de líneas de pedido entra en detalles para la solicitud única con los datos XML de respuesta y solicitud, ya que mostrar esta gran cantidad de datos en la cuadrícula puede ser problemático.

NOTAS

Siempre agregue un Sistema -> Opción de configuración para activar / desactivar el inicio de sesión, ya que con una gran cantidad de solicitudes que pasan por la comunicación API, la tabla puede volverse bastante pesada y afectar el rendimiento. Normalmente deshabilitaré el registro después de que la integración haya estado funcionando correctamente por un tiempo.

Idealmente, podría aprovechar Mage_Log y simplemente agregar su tabla personalizada a su lista de tablas que se podarán en intervalos para mantenerla delgada, sin embargo, no estoy seguro del procedimiento adecuado para tales campos específicos de fecha / hora.

También puede considerar el uso de atributos personalizados para almacenar sus datos relacionales entre Magento y la API de terceros.

Esperemos que esto ayude en una dirección general de eliminar el aguijón de las integraciones de terceros. Como no todos los requisitos son iguales. Dicho esto, sin embargo, un mecanismo de registro de API generalizado puede ser beneficioso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.