外部のフルフィルメントパートナーを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;
注: DBスペースを節約するために、リクエストとレスポンスのXMLをgzip形式で保存することについても議論しました。XMLは適切に圧縮されます。ただし、Magentoのadminhtmlグリッドにはカスタムレンダラーが必要になるため、現時点ではXMLをそのまま保存しました。
2)PHPを介した汎用REST CURL要求
私は通常、単一のクラスを1つ使用します。たとえば、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
また、この単純なRESTリクエストスニペットで使用するリクエストを作成するために、Array2XMLと呼ばれる別のライブラリも使用していPOST
ます。
* @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
と$logModel->save();
とMage::logException($e);
Rest.phpでは、ヘルプデバッグに統合してすべての問題をより良くすることができます。致命的な例外はリソースモデルに部分的に記録されますが、var/log/excpetions.log
4)ADMIN HTML GRID
次に、ログデータを保持するテーブルに新しいカスタムMagento adminhtmlグリッドを作成します。
グリッドでのラインアイテムのクリックは、グリッドにこの大量のデータを表示すると問題が発生する可能性があるため、応答および要求XMLデータを使用した単一の要求の詳細に進みます。
ノート
常にシステム->構成オプションを追加して、ロギングをオン/オフに切り替えます。API通信を通過する多数のリクエストでは、テーブルが非常に重くなり、パフォーマンスに影響する可能性があるためです。統合がしばらくの間適切に機能している場合、通常はログを無効にします。
理想的にはMage_Logを活用し、カスタムテーブルをテーブルのリストに追加して、間隔を空けて細長く保つことができますが、特定の日付/時刻フィールドなどの適切な手順が必要かどうかはわかりません。
カスタム属性を使用して、MagentoとサードパーティAPIの間のリレーショナルデータを保存することもできます。
うまくいけば、これはサードパーティの統合からおとりを取り除く一般的な方向に役立つでしょう。すべての要件が同じであるとは限りません。ただし、一般化されたAPIロギングメカニズムが有益な場合もあります。