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?

Stephan
fonte
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.

B00MER
fonte