SOAP请求记录器


Answers:


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;

注意:我还讨论了以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日志记录机制可能是有益的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.