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?
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?
Respuestas:
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 POST
solicitudes 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
, $apiKey
son 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.php
llamadas 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
/ catch
con 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.