мы хотим подключить внешнего партнера по выполнению к Magento и хотим регистрировать их запросы API.
Есть ли бесплатный и доступный логгер API с открытым исходным кодом?
мы хотим подключить внешнего партнера по выполнению к Magento и хотим регистрировать их запросы API.
Есть ли бесплатный и доступный логгер API с открытым исходным кодом?
Ответы:
Я укушу, так как я только недавно сделал это, однако это была служба 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
/ catch
with $logModel->save();
и a Mage::logException($e);
в Rest.php могут лучше помочь отладить любые проблемы с интеграцией. Поскольку фатальные исключения все еще будут частично зарегистрированы в вашей модели ресурсов, но также появятся вvar/log/excpetions.log
4) СДЕЛАЙТЕ СЕТЬ HTML
Теперь просто создайте новую таблицу Magento adminhtml Grid для вашей таблицы, содержащей данные журнала.
Мой щелчок по позициям в моей таблице подробно описывает один запрос с данными XML ответа и запроса, так как отображение такого большого количества данных в таблице может быть проблематичным.
НОТЫ
Всегда добавляйте опцию Система -> Конфигурация, чтобы включить или выключить регистрацию, так как при большом количестве запросов, проходящих через связь API, таблица может стать довольно тяжелой и повлиять на производительность. Обычно я отключаю ведение журнала после того, как интеграция будет работать должным образом некоторое время.
В идеале вы могли бы использовать Mage_Log и просто добавить свою пользовательскую таблицу в список таблиц, которые следует сокращать через определенные промежутки времени, чтобы сохранить ее стройность, однако я не уверен в правильности соответствующей процедуры, например, для определенных полей даты / времени.
Вы также можете рассмотреть возможность использования пользовательских атрибутов для хранения ваших реляционных данных между Magento и Сторонним API.
Надеюсь, это поможет в общем направлении избавиться от сторонних интеграций. Поскольку не все требования всегда одинаковы. С учетом сказанного, однако, может быть полезен обобщенный механизм регистрации API.