Logger для запросов SOAP

8

мы хотим подключить внешнего партнера по выполнению к Magento и хотим регистрировать их запросы API.

Есть ли бесплатный и доступный логгер API с открытым исходным кодом?

Stephan
источник
1
Я нашел это, но не знаю о статусе github.com/netz98/N98_ApiLogger
Алекс
1
Я использую этот модуль от Marko-M из Inchoo для регистрации вызовов SOAP (v1 и v2 и wsi) github.com/Marko-M/Inchoo_SoapLogger
7

Ответы:

2

Я укушу, так как я только недавно сделал это, однако это была служба REST API, но что-то подобное для SOAP-запроса, безусловно, возможно. Таким образом, вместо деталей, в частности, просто обзор процесса, который я взял:

1) СОЗДАТЬ МОДЕЛЬ РЕСУРСА

Сначала вы захотите создать новую модель ресурсов Magento, для этого есть множество примеров:

Вот пример таблицы, которую я создаю во время установки моих модулей (очевидно, адаптируйте ее под свои нужды / требования).

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;

Примечание: я также обсуждал вопрос о сохранении XML-кода запроса и ответа в формате gzip для экономии места в БД, и XML хорошо сжимается. Однако в админке Grid Magento потребовался пользовательский рендерер, поэтому я сохранил XML как есть.

2) ОБЩИЕ ЗАПРОСЫ ОТ ОТДЫХА ОТ PHP

Например, я обычно использую один отдельный класс: Rest.php с чем-то похожим для быстрых и безболезненных вызовов API через CURL в моем модуле. Я полагаю, что варианты lib / Varien и Zendframework также могут быть чем-то, что нужно учитывать, однако я добился большого успеха с этим небольшим легко читаемым фрагментом:

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

Источник: http://singletonio.blogspot.com/2009/07/simple-php-rest-client-using-curl.html

Я также использую другую отдельную библиотеку под названием Array2XML для построения моих POSTзапросов, которые будут использоваться с этим простым фрагментом 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()) {

Вот пример использования моего класса Rest.php: (Примечание: $restUrl, $apiKeyприводятся в движение от конфигурации).

// 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) ДОБАВИТЬ ВХОД В ЗАПРОСЫ / ОТВЕТЫ

Затем оберните свою вновь созданную модель ресурсов вокруг Rest.phpвызовов для сбора данных до и после возврата из стороннего API.

Примерно так раньше curl_exec :

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

...

И после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();
    }

Вместо того, чтобы просто возвращать объект cURL, я использую SimpleXMLElement ($ response) для преобразования ответа API в XML.

A try/ catchwith $logModel->save();и a Mage::logException($e);в Rest.php могут лучше помочь отладить любые проблемы с интеграцией. Поскольку фатальные исключения все еще будут частично зарегистрированы в вашей модели ресурсов, но также появятся вvar/log/excpetions.log

4) СДЕЛАЙТЕ СЕТЬ HTML

Теперь просто создайте новую таблицу Magento adminhtml Grid для вашей таблицы, содержащей данные журнала.

Мой щелчок по позициям в моей таблице подробно описывает один запрос с данными XML ответа и запроса, так как отображение такого большого количества данных в таблице может быть проблематичным.

НОТЫ

Всегда добавляйте опцию Система -> Конфигурация, чтобы включить или выключить регистрацию, так как при большом количестве запросов, проходящих через связь API, таблица может стать довольно тяжелой и повлиять на производительность. Обычно я отключаю ведение журнала после того, как интеграция будет работать должным образом некоторое время.

В идеале вы могли бы использовать Mage_Log и просто добавить свою пользовательскую таблицу в список таблиц, которые следует сокращать через определенные промежутки времени, чтобы сохранить ее стройность, однако я не уверен в правильности соответствующей процедуры, например, для определенных полей даты / времени.

Вы также можете рассмотреть возможность использования пользовательских атрибутов для хранения ваших реляционных данных между Magento и Сторонним API.

Надеюсь, это поможет в общем направлении избавиться от сторонних интеграций. Поскольку не все требования всегда одинаковы. С учетом сказанного, однако, может быть полезен обобщенный механизм регистрации API.

B00MER
источник