queremos conectar um parceiro de atendimento externo ao Magento e queremos registrar suas solicitações de API.
Existe algum logger de API de código aberto e gratuito disponível?
queremos conectar um parceiro de atendimento externo ao Magento e queremos registrar suas solicitações de API.
Existe algum logger de API de código aberto e gratuito disponível?
Respostas:
Eu vou morder uma vez que fiz isso recentemente, no entanto, era um serviço da API REST, mas algo semelhante para uma solicitação SOAP é certamente possível. Então, em vez de detalhes, particularmente apenas uma visão geral do processo que tomei:
1) CRIAR UM MODELO DE RECURSOS
Primeiro, você desejará criar um novo modelo de recursos Magento; existem muitos exemplos por aí:
Aqui está um exemplo da tabela que estou criando durante a instalação dos meus módulos (obviamente, adapte-a para atender às suas necessidades / 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: Também debati em armazenar o XML de solicitação e resposta em um formato gzip para economizar espaço de banco de dados, e o XML compacta bem. No entanto, o adminhtml Grid do Magento precisaria de um renderizador personalizado, por isso mantive o XML armazenado como está por enquanto.
2) PEDIDO GENÉRICO DE CURVA DE DESCANSO ATRAVÉS DO PHP
Normalmente, uso uma classe, por exemplo: Rest.php com algo semelhante para chamadas de API rápidas e sem problemas via CURL no meu módulo. Acredito que as opções lib / Varien e Zendframework também possam ser consideradas, no entanto, tive grande sucesso com este pequeno trecho fácil de ler:
<?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
Eu também uso outra biblioteca separada chamada Array2XML para criar minhas POST
solicitações para serem usadas com esse trecho de solicitação REST simples.
* @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()) {
Aqui está um exemplo de uso da minha classe Rest.php: (NOTA: $restUrl
, $apiKey
são expulsos de configuração).
// 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) ADICIONAR LOGGING A PEDIDOS / RESPOSTAS
Em seguida, agrupe seu modelo de recursos recém-criado em torno de Rest.php
chamadas para coletar dados antes e depois de um retorno da API de terceiros.
Algo assim antes curl_exec
:
if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
$logModel->setData('timestamp', time())
->setData('requestUrl', $url)
->setData('method', $method)
->setData('requestXML', @$postFields);
}
...
E depois do 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();
}
Em vez de retornar o objeto cURL, uso SimpleXMLElement ($ response) para converter a resposta das APIs em XML.
A try
/ catch
com um $logModel->save();
e uma Mage::logException($e);
no Rest.php melhor pode ajudar a depurar quaisquer problemas com a integração. Como exceções fatais ainda serão parcialmente registradas no seu modelo de recursos, mas também aparecerão emvar/log/excpetions.log
4) GRADE HTML ADMIN
Agora, basta criar uma nova grade personalizada do Magento adminhtml para sua tabela, mantendo os dados do log.
O clique dos itens de linha Meu Grid entra em detalhes para a solicitação única com os dados XML de Resposta e Solicitação, pois exibir esse grande número de dados na Grade pode ser problemático.
NOTAS
Sempre adicione uma opção Sistema -> Configuração para ativar / desativar o logon, pois, com um grande número de solicitações na comunicação da API, a tabela pode se tornar bastante pesada e afetar o desempenho. Normalmente desabilitarei o log depois que a integração estiver funcionando adequadamente por algum tempo.
Idealmente, você poderia aproveitar o Mage_Log e simplesmente adicionar sua tabela personalizada à sua lista de tabelas a serem removidas em intervalos para mantê-la reduzida, no entanto, não tenho certeza do procedimento adequado para campos específicos de data / hora.
Você também pode considerar o uso de atributos personalizados para armazenar seus dados relacionais entre o Magento e a API de terceiros.
Esperemos que isso ajude em uma direção geral de tirar o aguilhão das integrações de terceiros. Como nem todos os requisitos são sempre os mesmos. Com isso dito, um mecanismo de registro de API generalizado pode ser benéfico.