Registrador para solicitações SOAP


8

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?


11
Eu encontrei um presente, mas não sei sobre o status github.com/netz98/N98_ApiLogger
Alex

11
Estou usando este módulo por Marko-M de Inchoo para registrar chamadas SOAP (V1 e V2 e ISA) github.com/Marko-M/Inchoo_SoapLogger
7ochem

Respostas:


2

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 POSTsolicitaçõ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, $apiKeysã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.phpchamadas 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/ catchcom 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.