Wir möchten einen externen Fulfillment-Partner mit Magento verbinden und dessen API-Anforderungen protokollieren.
Gibt es einen kostenlosen und Open Source API Logger?
Wir möchten einen externen Fulfillment-Partner mit Magento verbinden und dessen API-Anforderungen protokollieren.
Gibt es einen kostenlosen und Open Source API Logger?
Antworten:
Ich werde beißen, da ich dies erst kürzlich getan habe, es war jedoch ein REST-API-Service, aber etwas Ähnliches für eine SOAP-Anfrage ist sicherlich möglich. Anstelle von Details, insbesondere nur einer Übersicht über den Prozess, den ich durchgeführt habe:
1) ERSTELLEN SIE EIN RESSOURCENMODELL
Zuerst möchten Sie ein neues Magento-Ressourcenmodell erstellen. Es gibt viele Beispiele dafür:
Hier ist ein Beispiel für die Tabelle, die ich während der Installation meiner Module erstelle (natürlich an Ihre Bedürfnisse / Anforderungen anpassen).
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;
Hinweis: Ich habe auch darüber diskutiert, das Anforderungs- und Antwort-XML in einem gzip-Format zu speichern, um Datenbankspeicherplatz zu sparen, und XML lässt sich gut komprimieren. Magentos adminhtml Grid würde jedoch einen benutzerdefinierten Renderer benötigen, sodass ich das XML vorerst unverändert gespeichert habe.
2) ALLGEMEINE REST-CURL-ANFRAGE ÜBER PHP
Normalerweise verwende ich eine einzelne Klasse, zum Beispiel: Rest.php mit etwas Ähnlichem für schnelle und schmerzlose API-Aufrufe über CURL in meinem Modul. Ich glaube, dass auch die Optionen lib / Varien und Zendframework in Betracht gezogen werden können, aber ich hatte großen Erfolg mit diesem kleinen, einfach zu lesenden Snippet:
<?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);
Quelle: http://singletonio.blogspot.com/2009/07/simple-php-rest-client-using-curl.html
Ich verwende auch eine andere separate Bibliothek namens Array2XML, um meine POST
Anforderungen für dieses einfache REST-Anforderungs-Snippet zu erstellen.
* @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()) {
Hier ist ein Anwendungsbeispiel meiner Rest.php Klasse: (Anmerkung: $restUrl
, $apiKey
sind von der Konfiguration angetrieben).
// 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) LOGGING ZU ANFRAGEN / ANTWORTEN HINZUFÜGEN
Wickeln Sie dann Ihr neu erstelltes Ressourcenmodell um Rest.php
Aufrufe, um Daten zu sammeln, bevor und nachdem eine Rückgabe von der Drittanbieter-API erfolgt ist.
Etwas wie folgt vor curl_exec
:
if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
$logModel->setData('timestamp', time())
->setData('requestUrl', $url)
->setData('method', $method)
->setData('requestXML', @$postFields);
}
...
Und nach dem 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();
}
Anstatt nur das cURL-Objekt zurückzugeben, verwende ich SimpleXMLElement ($ response), um die API-Antwort in XML zu konvertieren.
A try
/ catch
mit a $logModel->save();
und a Mage::logException($e);
in der Rest.php kann besser helfen, Probleme mit der Integration zu beheben. Da schwerwiegende Ausnahmen weiterhin teilweise in Ihrem Ressourcenmodell protokolliert werden, aber auch in angezeigt werdenvar/log/excpetions.log
4) ADMIN HTML GRID
Erstellen Sie jetzt einfach ein neues benutzerdefiniertes Magento-Adminhtml-Raster für Ihre Tabelle mit den Protokolldaten.
Das Klicken auf Werbebuchungen in meinem Raster wird für die einzelne Anforderung mit den XML-Daten "Antwort" und "Anforderung" detailliert beschrieben, da die Anzeige dieser großen Datenmenge im Raster problematisch sein kann.
ANMERKUNGEN
Fügen Sie immer eine System -> Konfigurationsoption hinzu, um die Protokollierung ein- oder auszuschalten, da bei einer großen Anzahl von Anforderungen, die die API-Kommunikation durchlaufen, die Tabelle sehr schwer werden und die Leistung beeinträchtigen kann. Normalerweise deaktiviere ich die Protokollierung, nachdem die Integration eine Weile ordnungsgemäß funktioniert hat.
Im Idealfall können Sie Mage_Log nutzen und Ihre benutzerdefinierte Tabelle einfach zu der Liste der Tabellen hinzufügen, die in Intervallen entfernt werden sollen, um sie schlank zu halten. Ich bin mir jedoch nicht sicher, wie das richtige Verfahren für bestimmte Datums- / Zeitfelder erforderlich sein kann.
Sie können auch benutzerdefinierte Attribute verwenden, um Ihre relationalen Daten zwischen Magento und der Drittanbieter-API zu speichern.
Hoffentlich hilft dies in einer allgemeinen Richtung, um Integrationen von Drittanbietern den Garaus zu machen. Da nicht alle Anforderungen gleich sind. Vor diesem Hintergrund kann jedoch ein verallgemeinerter API-Protokollierungsmechanismus von Vorteil sein.