Mengembangkan plugin kustom

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Edge Microgateway v. 2.4.x

Audiens

Topik ini ditujukan bagi developer yang ingin memperluas fitur Edge Microgateway dengan menulis plugin khusus. Jika Anda ingin menulis plugin baru, pengalaman dengan JavaScript dan Node.js adalah tidak diperlukan.

Apa itu plugin Edge Microgateway kustom?

Plugin adalah modul Node.js yang menambahkan fungsionalitas ke Edge Microgateway. Modul plugin mengikuti pola yang konsisten dan disimpan di lokasi yang dikenal oleh Edge Microgateway, sehingga file itu ditemukan dan dijalankan secara otomatis. Beberapa plugin yang telah ditetapkan disediakan saat Anda instal Edge Microgateway. Ini termasuk plugin untuk autentikasi, hambatan lonjakan, kuota, dan Analytics. Plugin yang sudah ada ini dijelaskan dalam Menggunakan plugin.

Anda dapat menambahkan fitur dan kemampuan baru ke microgateway dengan menulis custom plugin. Secara {i>default<i}, Edge Microgateway pada dasarnya adalah {i>proxy<i} yang aman yang meneruskan permintaan dan respons yang tidak berubah ke dan dari layanan target. Dengan plugin kustom, Anda dapat secara terprogram berinteraksi dengan permintaan dan respons yang mengalir melalui microgateway.

Tempat untuk meletakkan kode plugin kustom

Folder untuk plugin khusus disertakan sebagai bagian dari penginstalan Edge Microgateway di sini:

[prefix]/npm/lib/node_modules/edgemicro/plugins

dengan [prefix] adalah direktori awalan npm sebagai dijelaskan dalam "Di mana Edge Microgateway terinstal" di Menginstal Edge Microgateway.

Anda dapat mengubah direktori plugin default ini. Lihat Tempat untuk temukan plugin.

Meninjau plugin yang telah ditetapkan sebelumnya

Sebelum Anda mencoba mengembangkan {i>plugin<i} sendiri, sebaiknya periksa plugin yang sesuai dengan kebutuhan Anda. Plugin ini terdapat di:

[prefix]/npm/lib/node_modules/edgemicro/node_modules/microgateway-plugins

dengan [prefix] adalah direktori awalan npm. Lihat juga "Di mana Edge Microgateway terinstal" di Menginstal Edge Microgateway.

Untuk detailnya, lihat juga Standar plugin yang disediakan dengan Edge Microgateway.

Menulis plugin sederhana

Di bagian ini, kita akan memandu langkah-langkah yang diperlukan untuk membuat {i>plugin<i} sederhana. Plugin ini akan mengganti data respons (apa pun itu) dengan string "Hello, World!" (Halo Dunia) dan mencetaknya ke terminal.

  1. Jika Edge Microgateway sedang berjalan, hentikan sekarang:
    edgemicro stop
  2. cd ke direktori plugin kustom:

    cd [prefix]/npm/lib/node_modules/edgemicro/plugins

    dengan [prefix] adalah direktori awalan npm seperti yang dijelaskan dalam "Di mana Edge Microgateway terinstal" di Menginstal Edge Microgateway.

  3. Membuat project plugin baru yang disebut response-override dan cd untuk tindakan tersebut:
    mkdir response-override && cd response-override
  4. Buat project Node.js baru:
    npm init
    Tekan Return beberapa kali untuk menyetujui setelan default.
  5. Gunakan editor teks untuk membuat file baru bernama index.js.
  6. Salin kode berikut ke index.js, dan simpan file.
    'use strict';
    var debug = require('debug')
    
    module.exports.init = function(config, logger, stats) {
    
      return {
       
        ondata_response: function(req, res, data, next) {
          debug('***** plugin ondata_response');
          next(null, null);
        },
        
        onend_response: function(req, res, data, next) {
          debug('***** plugin onend_response');
          next(null, "Hello, World!\n\n");
        }
      };
    }
  7. Sekarang Anda telah membuat plugin, dan perlu menambahkannya ke konfigurasi Edge Microgateway. Buka file $HOME/.edgemicro/[org]-[env]-config.yaml, dengan org dan env adalah organisasi Edge Anda dan nama lingkungan.
  8. Tambahkan plugin response-override ke elemen plugins:sequence seperti yang ditunjukkan di bawah ini.
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
        
  9. Mulai ulang Edge Microgateway.
  10. Memanggil API melalui Edge Microgateway. (Panggilan API ini mengasumsikan bahwa Anda telah menyiapkan seperti tutorial dengan keamanan kunci API, seperti yang dijelaskan dalam Setelan mengonfigurasi dan mengonfigurasi Edge Microgateway:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!

Anatomi plugin

Plugin contoh Edge Microgateway berikut mengilustrasikan pola yang harus diikuti saat mengembangkan plugin Anda sendiri. Kode sumber untuk contoh plugin yang dibahas di bagian ini adalah dalam plugins/header-uppercase/index.js.

  • Plugin adalah modul NPM standar dengan package.json dan index.js di root folder tersebut.
  • Plugin harus mengekspor fungsi init().
  • Fungsi init() mengambil tiga argumen: config, logger, dan statistik. Argumen ini dijelaskan di Argumen fungsi init() plugin.
  • init() menampilkan objek dengan handler fungsi bernama yang dipanggil saat peristiwa tertentu terjadi selama masa aktif permintaan.

Fungsi pengendali peristiwa

Plugin harus menerapkan beberapa atau semua fungsi pengendali peristiwa ini. Implementasi dari fungsi, atau fungsi lainnya, terserah Anda. Setiap fungsi yang diberikan bersifat opsional, dan plugin standar akan diimplementasikan di subset dari fungsi-fungsi tersebut.

Pengendali peristiwa alur permintaan

Fungsi ini dipanggil berdasarkan peristiwa permintaan di Edge Microgateway.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest fungsi

Dipanggil pada awal permintaan klien. Fungsi ini aktif ketika byte pertama diterima oleh Edge Microgateway. Fungsi ini memberi Anda akses ke header permintaan, URL, parameter kueri, dan metode HTTP. Jika Anda memanggil berikutnya dengan argumen pertama yang benar (seperti instance Error), pemrosesan permintaan akan berhenti dan permintaan target tidak dimulai.

Contoh:

onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-start'] = Date.now();
      next();
    }

ondata_request fungsi

Dipanggil saat sepotong data diterima dari klien. Meneruskan data permintaan ke yang berikutnya plugin dalam urutan plugin. Nilai yang ditampilkan dari plugin terakhir dalam urutan dikirim ke targetnya. Kasus penggunaan umum, yang ditampilkan di bawah ini, adalah mengubah data permintaan sebelum mengirimkannya sesuai target.

Contoh:

ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }

onend_request fungsi

Dipanggil saat semua data permintaan telah diterima dari klien.

Contoh:

onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    }

Fungsi onclose_request

Menunjukkan koneksi klien telah ditutup. Anda mungkin menggunakan fungsi ini dalam kasus di mana koneksi klien tidak dapat diandalkan. Callback ini dipanggil ketika koneksi soket ke klien tutup.

Contoh:

onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    }

Fungsi onerror_request

Dipanggil jika terjadi error saat menerima permintaan klien.

Contoh:

onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    }

Pengendali peristiwa alur respons

Fungsi ini dipanggil pada peristiwa respons di Edge Microgateway.

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

Fungsi onresponse

Dipanggil pada awal respons target. Fungsi ini aktif ketika byte pertama respons diterima oleh Edge Microgateway. Fungsi ini memberi Anda akses ke header respons dan kode status.

Contoh:

onresponse: function(req, res, next) {      
    debug('plugin onresponse');     
    res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start'])    
    next();    
}


Fungsi ondata_response

Dipanggil saat sepotong data diterima dari target.

Contoh:

ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }


Fungsi onend_response

Dipanggil saat semua data respons telah diterima dari target.

Contoh:

onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    }

Fungsi onclose_response

Menunjukkan bahwa koneksi target telah ditutup. Anda mungkin menggunakan fungsi ini dalam kasus di mana koneksi target tidak dapat diandalkan. Callback ini dipanggil ketika koneksi soket ke target tutup.

Contoh:

onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }


Fungsi onerror_response

Dipanggil jika terjadi error saat menerima respons target.

Contoh:

onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    }

Yang perlu Anda ketahui tentang fungsi pengendali peristiwa plugin

Fungsi pengendali peristiwa plugin dipanggil sebagai respons terhadap peristiwa tertentu yang terjadi saat Edge Microgateway memproses permintaan API tertentu.

  • Setiap pengendali fungsi init() (ondata_request, ondata_response, dll.) harus memanggil callback next() saat pemrosesan selesai. Jika Anda tidak memanggil next(), pemrosesan akan berhenti dan permintaan akan berhenti.
  • Argumen pertama untuk next() mungkin error yang akan menyebabkan untuk menghentikan pemrosesan permintaan.
  • Pengendali ondata_ dan onend_ harus panggil next() dengan argumen kedua yang berisi data yang akan diteruskan ke target atau klien. Argumen ini bisa null jika plugin sedang buffering dan belum cukup data untuk ditransformasi saat ini.
  • Perhatikan bahwa satu instance plugin digunakan untuk melayani semua permintaan dan respons. Jika ingin mempertahankan status per permintaan di antara panggilan, plugin dapat menyimpan status tersebut dalam properti ditambahkan ke objek request yang disediakan (req), yang masa aktifnya adalah durasi panggilan API.
  • Berhati-hatilah untuk menangkap semua error dan memanggil next() yang berisi error tersebut. Jika next() tidak dipanggil, panggilan API akan macet.
  • Berhati-hatilah agar tidak menyebabkan kebocoran memori karena hal itu dapat memengaruhi performa Edge secara keseluruhan Microgateway dan menyebabkannya error jika kehabisan memori.
  • Berhati-hatilah dalam mengikuti model Node.js dengan tidak melakukan tugas komputasi intensif di thread karena hal ini dapat berpengaruh buruk pada performa Edge Microgateway.

Tentang fungsi init() plugin

Bagian ini menjelaskan argumen yang diteruskan ke fungsi init(): config, logger, dan statistik.

config

Objek konfigurasi yang diperoleh setelah menggabungkan file konfigurasi Edge Microgateway dengan informasi yang didownload dari Apigee Edge, seperti produk dan kuota. Anda dapat menemukan konfigurasi khusus plugin di objek ini: config.<plugin-name>.

Untuk menambahkan parameter konfigurasi bernama param dengan nilai foo ke plugin bernama response-override, ini dalam file default.yaml:

response-override:
    param: foo

Kemudian, Anda dapat mengakses parameter tersebut dalam kode plugin, seperti ini:

// Called when response data is received
    ondata_response: function(req, res, data, next) {
      debug('***** plugin ondata_response');
      debug('***** plugin ondata_response: config.param: ' + config.param);
      next(null, data);
    },

Dalam hal ini, Anda akan melihat foo dicetak dalam output debug plugin:

Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo

pencatat log

Pencatat sistem. Pencatat log yang saat ini digunakan mengekspor fungsi-fungsi ini, di mana objek dapat string, permintaan HTTP, respons HTTP, atau instance Error.

  • info(object, message)
  • warn(object, message)
  • error(object, message)

stats

Objek yang menyimpan jumlah permintaan, respons, error, dan statistik gabungan lainnya berkaitan dengan permintaan dan respons yang mengalir melalui instance microgateway.

  • treqErrors - Jumlah permintaan target dengan error.
  • treqErrors - Jumlah respons target dengan error.
  • statusCodes - Objek yang berisi jumlah kode respons:
{
  1: number of target responses with 1xx response codes
  2: number of target responses with 2xx response codes
  3: number of target responses with 3xx response codes
  4: number of target responses with 4xx response codes
  5: number of target responses with 5xx response codes
  }
  
  • permintaan - Jumlah total permintaan.
  • respons - Jumlah total respons.
  • connections - Jumlah koneksi target aktif.

Tentang fungsi next()

Semua metode plugin harus memanggil next() untuk melanjutkan pemrosesan langkah berikutnya dalam rangkaian (atau proses plugin akan berhenti berfungsi). Dalam siklus proses permintaan, hal pertama yang dipanggil adalah onrequest(). Metode selanjutnya yang akan dipanggil adalah metode ondata_request(); namun, ondata_request hanya dipanggil jika menyertakan data, seperti dalam kasus tersebut, misalnya, dari permintaan POST. Metode berikutnya yang disebut adalah onend_request(), yang dipanggil saat pemrosesan permintaan selesai. Fungsi onerror_* hanya dipanggil jika terjadi dan memungkinkan Anda menangani kesalahan dengan kode khusus.

Misalkan data dikirim dalam permintaan, dan ondata_request() dipanggil. Perhatikan bahwa fungsi tersebut memanggil next() dengan dua parameter:

next(null, data);

Berdasarkan konvensi, parameter pertama digunakan untuk menyampaikan informasi {i>error<i}, yang kemudian dapat Anda dalam fungsi berikutnya dalam rantai tersebut. Dengan menyetelnya ke null, metode falsy , kami mengatakan tidak ada kesalahan, dan pemrosesan permintaan harus berjalan seperti biasa. Jika argumen ini benar (seperti objek Error), maka pemrosesan permintaan akan berhenti dan permintaan akan dikirim ke target.

Parameter kedua meneruskan data permintaan ke fungsi berikutnya dalam rantai. Jika Anda tidak pemrosesan tambahan, data permintaan diteruskan tanpa berubah ke target API. Namun, Anda memiliki kesempatan untuk mengubah data permintaan dalam metode ini, dan meneruskan permintaan ke target. Misalnya, jika data permintaan berupa XML, dan target mengharapkan JSON, Anda dapat menambahkan kode ke metode ondata_request() yang (a) mengubah Content-Type header permintaan menjadi application/json dan mengonversi minta data ke JSON dengan cara apa pun yang Anda inginkan (misalnya, Anda dapat menggunakan Konverter xml2json Node.js yang diperoleh dari NPM).

Mari kita lihat tampilannya:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request);
  var translated_data = parser.toJson(data);
  next(null, translated_data);
},

Dalam hal ini, data permintaan (yang diasumsikan sebagai XML) dikonversi ke JSON, dan data yang diubah akan diteruskan melalui next() ke fungsi berikutnya dalam permintaan rantai, sebelum diteruskan ke target backend.

Perhatikan bahwa Anda dapat menambahkan pernyataan debug lain guna mencetak data yang telah diubah untuk proses debug tujuan. Contoh:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request);
  var translated_data = parser.toJson(data);
  debug('****** plugin ondata_response: translated_json: ' + translated_json);
  next(null, translated_data);
},

Tentang urutan eksekusi pengendali plugin

Jika Anda menulis plugin untuk Edge Microgateway, Anda perlu memahami urutan plugin dijalankan.

Hal penting yang harus diingat adalah ketika Anda menentukan urutan plugin di Edge File konfigurasi Microgateway, pengendali permintaan mengeksekusi dalam urutan menaik, sedangkan pengendali respons mengeksekusi dalam urutan menurun.

Contoh berikut didesain untuk membantu Anda memahami urutan eksekusi ini.

1. Buat tiga elemen plugin

Pertimbangkan plugin berikut. Yang dilakukan hanyalah output konsol cetak saat pengendali peristiwanya disebut:

plugins/plugin-1/index.js

module.exports.init = function(config, logger, stats) {

  return {

    onrequest: function(req, res, next) {
      console.log('plugin-1: onrequest');
      next();
    },

    onend_request: function(req, res, data, next) {
      console.log('plugin-1: onend_request');
      next(null, data);
    },

    ondata_response: function(req, res, data, next) {
      console.log('plugin-1: ondata_response ' + data.length);
      next(null, data);
    },

    onend_response: function(req, res, data, next) {
      console.log('plugin-1: onend_response');
      next(null, data);
    }
  };
}

Sekarang, pertimbangkan untuk membuat dua lagi plugin, plugin-2 dan plugin-3, dengan kode yang sama (kecuali, ubah pernyataan console.log() menjadi plugin-2 dan plugin-3 masing-masing).

2. Meninjau kode plugin

Fungsi plugin yang diekspor di <microgateway-root-dir>/plugins/plugin-1/index.js adalah peristiwa yang dieksekusi pada waktu tertentu selama pemrosesan permintaan dan respons. Sebagai misalnya, onrequest mengeksekusi byte pertama dari header permintaan adalah diterima. Sementara, onend_response dieksekusi setelah byte respons terakhir data diterima.

Lihat pengendali ondata_response -- yang akan dipanggil setiap kali data respons diberikan diterima. Hal yang penting untuk diketahui adalah bahwa data respons tidak harus diterima sama sekali sekali. Sebaliknya, data dapat diterima dalam potongan dengan panjang arbitrer.

3. Tambahkan plugin ke urutan plugin

Melanjutkan contoh ini, kita akan menambahkan plugin ke urutan plugin di Edge File konfigurasi Microgateway (~./edgemicro/config.yaml) sebagai berikut. Urutannya adalah sangatlah penting. Ini menentukan urutan eksekusi pengendali plugin.

  plugins:
    dir: ../plugins
    sequence:
      - plugin-1
      - plugin-2
      - plugin-3
  

4. Memeriksa output debug

Sekarang, mari kita lihat output yang akan dihasilkan saat plugin ini dipanggil. Ada beberapa hal penting yang perlu diperhatikan:

  • Plugin mengurutkan file konfigurasi Edge Microgateway (~./edgemicro/config.yaml) menentukan urutan pengendali peristiwa dipanggil.
  • Pengendali permintaan dipanggil dalam urutan menaik (urutan dalam yang muncul dalam urutan {i>plugin<i} - - 1, 2, 3).
  • Pengendali respons dipanggil dalam urutan menurun -- 3, 2, Akun Layanan 1.
  • Pengendali ondata_response dipanggil sekali untuk setiap bagian data yang diterima. Dalam contoh ini ({i>output<i} ditampilkan di bawah ini), dua potongan diterima.

Berikut contoh output debug yang dihasilkan saat ketiga plugin ini digunakan dan permintaan dikirim melalui Edge Microgateway. Perhatikan urutan pemanggilan pengendali:

  plugin-1: onrequest
  plugin-2: onrequest
  plugin-3: onrequest

  plugin-1: onend_request
  plugin-2: onend_request
  plugin-3: onend_request

  plugin-3: ondata_response 931
  plugin-2: ondata_response 931
  plugin-1: ondata_response 931

  plugin-3: ondata_response 1808
  plugin-3: onend_response

  plugin-2: ondata_response 1808
  plugin-2: onend_response

  plugin-1: ondata_response 1808
  plugin-1: onend_response

Ringkasan

Memahami urutan pemanggilan pengendali plugin sangat penting saat Anda mencoba menerapkan fungsi plugin kustom, seperti mengumpulkan dan mengubah permintaan atau respons layanan otomatis dan data skalabel.

Ingatlah bahwa pengendali permintaan dieksekusi sesuai urutan plugin yang yang ditentukan dalam file konfigurasi Edge Microgateway, dan handler respons dieksekusi di urutan yang berlawanan.

Tentang penggunaan variabel global pada plugin

Setiap permintaan ke Edge Microgateway dikirim ke instance plugin yang sama; Oleh karena itu, status permintaan kedua dari klien lain akan menimpa permintaan pertama. Satu-satunya tempat yang aman untuk menyimpan status plugin adalah dengan menyimpan status di properti pada objek permintaan atau respons (yang masa aktif terbatas pada masa berlaku permintaan).

Menulis ulang URL target di plugin

Ditambahkan di: v2.3.3

Anda dapat mengganti URL target default dalam plugin secara dinamis dengan mengubah variabel ini di plugin Anda kode: req.targetHostname dan req.targetPath.

Ditambahkan di: v2.4.x

Anda juga dapat mengganti port endpoint target dan memilih antara HTTP dan HTTPS. Ubah ini variabel di plugin Anda kode: req.targetPort dan req.targetSecure. Kepada pilih HTTPS, tetapkan req.targetSecure ke true; untuk HTTP, tetapkan ke false. Jika Anda menetapkan req.targetSecure ke true, lihat diskusi ini thread untuk informasi selengkapnya.

Contoh plugin bernama eurekaclient telah ditambahkan ke Edge Microgateway. Plugin ini menunjukkan cara menggunakan req.targetPort dan req.targetSecure variabel dan menggambarkan cara Edge Microgateway melakukan pencarian endpoint dinamis menggunakan Katalog endpoint Eureka as a service.


Contoh plugin

Plugin ini disediakan bersama penginstalan Edge Microgateway Anda. Anda dapat menemukannya di Penginstalan Edge Microgateway di sini:

[prefix]/npm/lib/node_modules/edgemicro/plugins

dengan [prefix] adalah direktori awalan npm sebagai dijelaskan dalam "Di mana Edge Microgateway terinstal" di Menginstal Edge Microgateway.

accumulate-request

Plugin ini mengakumulasi potongan data dari klien ke dalam properti array yang terkait dengan . Saat semua data permintaan diterima, array akan digabungkan menjadi Buffer yang kemudian diteruskan ke {i> plugin<i} berikutnya dalam urutan. Plugin ini harus menjadi plugin pertama secara berurutan agar plugin berikutnya menerima data permintaan terakumulasi.

module.exports.init = function(config, logger, stats) {

  function accumulate(req, data) {

    if (!req._chunks) req._chunks = [];
    req._chunks.push(data);

  }

  return {

    ondata_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      next(null, null);

    },


    onend_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      var content = null;

      if (req._chunks && req._chunks.length) {

        content = Buffer.concat(req._chunks);

      }

      delete req._chunks;

      next(null, content);

    }

  };

}

accumulate-response

Plugin ini mengakumulasi potongan data dari target ke dalam properti array yang terkait dengan objek respons. Ketika semua data respons diterima, array akan digabungkan menjadi Buffer yang kemudian diteruskan ke {i> plugin<i} berikutnya dalam urutan. Karena {i>plugin<i} ini beroperasi pada yang diproses dalam urutan terbalik, Anda harus menempatkannya sebagai plugin terakhir dalam urutan ini.

module.exports.init = function(config, logger, stats) {

  function accumulate(res, data) {
    if (!res._chunks) res._chunks = [];
    res._chunks.push(data);
  }

  return {

    ondata_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      next(null, null);
    },

    onend_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      var content = Buffer.concat(res._chunks);
      delete res._chunks;
      next(null, content);
    }

  };

}

plugin header-uppercase

Distribusi Edge Microgateway menyertakan contoh plugin disebut <microgateway-root-dir>/plugins/header-uppercase. Contoh menyertakan komentar yang menjelaskan masing-masing pengendali fungsi. Sampel ini melakukan beberapa data sederhana transformasi respons target dan menambahkan header kustom ke target dan permintaan klien yang dihasilkan.

Berikut adalah kode sumbernya untuk <microgateway-root-dir>/plugins/header-uppercase/index.js:

'use strict';

var debug = require('debug')('plugin:header-uppercase');

// required
module.exports.init = function(config, logger, stats) {

  var counter = 0;

  return {

    // indicates start of client request
    // request headers, url, query params, method should be available at this time
    // request processing stops (and a target request is not initiated) if
    // next is called with a truthy first argument (an instance of Error, for example)
    onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-id'] = counter++;
      req.headers['x-foo-request-start'] = Date.now();
      next();
    },

    // indicates start of target response
    // response headers and status code should be available at this time
    onresponse: function(req, res, next) {
      debug('plugin onresponse');
      res.setHeader('x-foo-response-id', req.headers['x-foo-request-id']);
      res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']);
      next();
    },

    // chunk of request body data received from client
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the target
    ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // chunk of response body data received from target
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the client
    ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // indicates end of client request
    onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    },

    // indicates end of target response
    onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    },

    // error receiving client request
    onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    },

    // error receiving target response
    onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    },

    // indicates client connection closed
    onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    },

    // indicates target connection closed
    onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }

  };

}

ubah-huruf-besar

Ini adalah {i>plugin<i} transformasi umum yang dapat Anda ubah untuk melakukan jenis transformasi yang Anda inginkan. Contoh ini hanya mengubah respons dan data permintaan untuk huruf besar.

 */
module.exports.init = function(config, logger, stats) {

  // perform content transformation here
  // the result of the transformation must be another Buffer
  function transform(data) {
    return new Buffer(data.toString().toUpperCase());
  }

  return {

    ondata_response: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_response: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    },

    ondata_request: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_request: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    }

  };

}

Tutorial plugin tambahan

Lihat juga tutorial ini di Blog Apigee: