我们希望将外部履行合作伙伴连接到Magento,并希望记录他们的API请求。
有没有免费的开源API记录器?
我们希望将外部履行合作伙伴连接到Magento,并希望记录他们的API请求。
有没有免费的开源API记录器?
Answers:
因为最近才这样做,所以我会咬牙,但是那是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;
注意:我还讨论了以gzip格式存储请求和响应XML以节省数据库空间,并且XML压缩良好。但是,Magento的adminhtml Grid需要一个自定义渲染器,因此我现在将XML保持为原样存储。
2)通过PHP进行一般的REST CURL请求
我通常使用一个类,例如:Rest.php,它具有类似的内容,用于通过模块中的CURL进行快速,轻松的API调用。我相信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。
一try
/ catch
一个$logModel->save();
和Mage::logException($e);
在Rest.php可以更好地帮助调试与集成的任何问题。由于致命异常仍将部分记录在您的资源模型中,但也会出现在var/log/excpetions.log
4)ADMIN HTML GRID
现在,只需在保存日志数据的表上创建一个新的自定义Magento adminhtml网格。
我的Grid单击订单项的详细信息针对包含Response和Request XML数据的单个请求,因为在Grid上显示大量数据可能会出现问题。
笔记
始终添加“系统”->“配置”选项来打开/关闭日志记录,因为大量请求通过API通信时,该表可能变得很沉重并影响性能。通常,在集成正常运行一段时间后,我将禁用日志记录。
理想情况下,您可以利用Mage_Log并简单地将自定义表添加到要定期删除的表列表中,以使其保持苗条,但是我不确定是否需要适当的过程,例如可能需要特定的日期/时间字段。
您还可以考虑使用自定义属性在Magento和3rd Party API之间存储关系数据。
希望这有助于从总体上摆脱第三者集成。由于并非所有需求都是相同的。尽管如此,通用的API日志记录机制可能是有益的。