Logger untuk Permintaan SOAP

8

kami ingin menghubungkan mitra pemenuhan eksternal ke Magento dan ingin mencatat permintaan API mereka.

Apakah ada logger API open source gratis dan tersedia?

Stephan
sumber
1
Saya menemukan ini tetapi tidak tahu tentang status github.com/netz98/N98_ApiLogger
Alex
1
Saya menggunakan modul ini oleh Marko-M dari Inchoo untuk mencatat panggilan SOAP (v1 dan v2 dan wsi) github.com/Marko-M/Inchoo_SoapLogger
7ochem

Jawaban:

2

Saya akan gigit karena saya baru-baru ini melakukan ini, itu adalah layanan REST API, tetapi sesuatu yang mirip dengan permintaan SOAP pasti mungkin. Jadi alih-alih detail, terutama hanya ikhtisar proses yang saya ambil:

1) BUAT MODEL SUMBER DAYA

Pertama Anda ingin membuat model sumber daya Magento baru, ada banyak contoh di luar sana untuk itu:

Berikut ini adalah contoh dari tabel yang saya buat selama modul saya instal (tentu saja sesuaikan dengan kebutuhan / persyaratan Anda).

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;

Catatan: Saya juga berdebat tentang menyimpan permintaan dan respons XML dalam format gzip untuk menghemat ruang db, dan XML memampatkan dengan baik. Namun adminhtml Magento's Grid akan membutuhkan perender kustom, jadi saya menyimpan XML apa adanya untuk saat ini.

2) PERMINTAAN ISTIMEWA ISTIMEWA VUR PHP

Saya biasanya menggunakan satu kelas tunggal, misalnya: Rest.php dengan sesuatu yang serupa untuk panggilan API cepat dan tidak menyakitkan melalui CURL dalam modul saya. Saya percaya opsi lib / Varien dan Zendframework mungkin juga sesuatu yang perlu dipertimbangkan, namun saya telah sukses besar dengan potongan kecil yang mudah dibaca ini:

<?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);

Sumber: http://singletonio.blogspot.com/2009/07/simple-php-rest-client-using-curl.html

Saya juga menggunakan pustaka terpisah lain bernama Array2XML untuk membangun POSTpermintaan saya untuk digunakan dengan potongan permintaan REST sederhana ini.

 * @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()) {

Berikut adalah contoh penggunaan kelas Rest.php saya: (CATATAN: $restUrl, $apiKeydidorong dari konfigurasi).

// 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) Tambahkan MASUK KE PERMINTAAN / TANGGAPAN

Kemudian bungkus model sumber daya Anda yang baru dibuat di sekitar Rest.phppanggilan untuk mengumpulkan data sebelum dan setelah pengembalian dilakukan dari API pihak ke-3.

Sesuatu seperti ini sebelumnya curl_exec :

    if (Mage::helper('mymodulename')->getAPILoggingEnable()) {
        $logModel->setData('timestamp', time())
                ->setData('requestUrl', $url)
                ->setData('method', $method)
                ->setData('requestXML', @$postFields);
    }

...

Dan setelah itu 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();
    }

Alih-alih hanya mengembalikan objek CURL saya menggunakan SimpleXMLElement ($ response) untuk mengonversi respons API ke XML.

A try/ catchwith a $logModel->save();dan a Mage::logException($e);di Rest.php dapat lebih baik membantu debug setiap masalah dengan integrasi. Karena pengecualian fatal akan tetap sebagian masuk dalam model sumber daya Anda tetapi juga muncul divar/log/excpetions.log

4) ADMIN HTML GRID

Sekarang cukup buat adminhtml Magento khusus baru Grid ke meja Anda yang menyimpan data log.

Klik item baris Grid saya menjelaskan secara detail permintaan tunggal dengan data XML Respons dan Permintaan karena menampilkan data sebesar ini di Grid dapat menjadi masalah.

CATATAN

Selalu tambahkan Sistem -> opsi Konfigurasi untuk menghidupkan / mematikan logging karena dengan sejumlah besar permintaan melalui komunikasi API, tabel bisa menjadi sangat berat dan mempengaruhi kinerja. Saya biasanya akan menonaktifkan pencatatan setelah integrasi berfungsi dengan benar untuk sementara waktu.

Idealnya Anda dapat memanfaatkan Mage_Log dan cukup menambahkan tabel khusus Anda ke daftar tabelnya untuk dipangkas pada interval untuk membuatnya tetap ramping, namun saya tidak yakin dengan prosedur yang tepat untuk bidang tanggal / waktu tertentu mungkin diperlukan.

Anda juga dapat mempertimbangkan menggunakan atribut khusus untuk menyimpan data relasional Anda antara Magento dan API Pihak ke-3.

Semoga ini membantu dalam arah umum untuk mengambil integrasi dari pihak ke-3. Karena tidak semua persyaratan selalu sama. Namun demikian, mekanisme log logging umum dapat bermanfaat.

B00MER
sumber