plugin hapi menyediakan tiruan untuk API berbasis ketenangan dan querystring
PEMBERITAHUAN: DUKUNGAN UNTUK PROYEK INI TELAH BERAKHIR
Proyeksi ini dimiliki dan dikelola oleh Walmart. Proyek ini telah mencapai akhir masa pakainya dan Walmart tidak lagi mendukung proyek ini.
Kami tidak lagi memantau masalah proyek ini atau meninjau permintaan penarikan. Anda bebas untuk terus menggunakan proyek ini di bawah persyaratan lisensi atau cabang proyek ini dengan risiko Anda sendiri. Proyek ini tidak lagi tunduk pada program bug bounty Walmart atau pemantauan keamanan lainnya.
Kami menyarankan Anda mengambil tindakan berikut:
Demi alasan keamanan, Walmart tidak mengalihkan kepemilikan repositori utama kami di Github atau platform lainnya kepada individu/organisasi lain. Selanjutnya, kami tidak mengalihkan kepemilikan paket untuk sistem manajemen paket publik.
Jika Anda ingin membagi paket ini dan melanjutkan pengembangan, Anda harus memilih nama baru untuk proyek tersebut dan membuat paket Anda sendiri, membangun otomatisasi, dll.
Harap tinjau persyaratan lisensi proyek ini, yang terus berlaku bahkan setelah dinonaktifkan.##curved-carousel
Cara sederhana untuk membuat carousel yang dapat di-scroll tanpa batas, dengan kelengkungan opsional.
Opsi berikut tersedia untuk konfigurasi.
apiPrefix
Sebuah string atau array string yang mewakili basis rute yang harus ditiru
Defaultnya adalah /api
mocksDir
Direktori yang berisi file tiruan.
Defaultnya adalah __dirname + './mocks'
, di mana __dirname adalah plugin ini
mocksAdminPath
URL relatif tempat halaman admin untuk plugin ini dapat ditemukan.
Defaultnya adalah /admin/mocks
mocksAdminServerLabels
Serangkaian label yang digunakan selama registrasi plugin hapi
Defaultnya adalah ['admin']
enabled
Apakah tiruannya diaktifkan atau tidak.
Defaultnya false
enableForceCookiePage
Boolean yang mewakili apakah halaman penyetel cookie akan didaftarkan atau tidak. Halaman ini memberikan tombol sederhana untuk mengaktifkan atau menonaktifkan cookie always_ridicule
, yang memungkinkan klien untuk ikut serta dalam memaksakan respons palsu, apa pun pengaturan servernya. Berguna untuk penguji pemula atau perangkat yang pembuatan bookmarkletnya rumit. Defaultnya false
forceCookiePath
URL relatif tempat halaman penyetel cookie dapat ditemukan.
Defaultnya adalah /cookie
forceCookieValue
Sebuah string yang mewakili nilai cookie always_ridicule
. Mengizinkan server memiliki metode tiruan keikutsertaan yang tersedia secara publik tanpa mengetahui cookie spesifik yang diperlukan secara publik. nilai expires
adalah 30 menit dari waktu yang ditetapkan.
Defaultnya adalah "true"
Di dalam mocksDir
Anda, buat file ridicule.js
yang memperlihatkan array hapi rute di module.exports
-nya.
module . exports = [ {
method : 'GET' ,
path : '/hello' ,
handler : function ( request , reply ) {
reply ( 'hello world' ) ;
}
} , {
method : 'POST' ,
path : '/goodbye' ,
handler : function ( request , reply ) {
reply ( 'thanks for all the fish' ) ;
}
} ]
Di awal server, semua rute yang dikonfigurasi didaftarkan dengan awalan 40 karakter acak. (misalnya rute /foo
diejek di /(uuid)/foo
)
Saat server tiruan diaktifkan, semua permintaan masuk dicocokkan dengan apiPrefix
yang dikonfigurasi. Ketika kecocokan ditemukan, permintaan diteruskan secara internal ke pengendali rute tiruan.
Anda memiliki kemampuan untuk memberikan dana talangan untuk meniru permintaan di suatu penangan (berguna ketika Anda hanya meniru sebagian dari sistem berbasis string kueri, karena hapi hanya cocok dengan jalur saja). Cukup require
rididcule dalam file, lalu panggil ridicule.bailout(req, res)
, di mana req
dan res
adalah objek permintaan dan respons di dalam handler.
Cara paling umum untuk meniru permintaan adalah dengan mengembalikan data file json dalam antarmuka reply()
pengendali rute Anda.
var data = require ( './mockFile.json' ) ;
var route = {
method : '*' ,
path : '/mockPath' ,
config : {
handler : function ( request , reply ) {
return reply ( data ) ;
}
}
} ;
Namun, Anda memiliki kemampuan untuk menambahkan metadata tambahan ke respons, seperti header khusus dan kode status HTTP. Anda hanya perlu membungkus file json yang ada di dalam objek lain, mengatur yang asli menjadi payload
, dan menambahkan bidang ridiculeSettings
.
jadi permintaan ini
{
"foo" : " bar "
}
menjadi
{
"ridiculeSettings" : {
"statusCode" : 418 ,
"headers" : { "Content-Type" : " x-stream " }
}
payload: {
"foo" : " bar "
}
}
Perlu dicatat bahwa karena ini ditambahkan di akhir aliran permintaan hapi, Akibatnya, karena payload
harus dimasukkan ke dalam file tiruan, dan oleh karena itu dibatasi hanya untuk mendukung objek string dan JSON, dan bukan aliran atau buffer.
Ada tiga cara untuk mengaktifkan/menonaktifkan tiruan.
Pengaturan konfigurasi hapi
Anda dapat mengubah opton enabled
di pengaturan Anda menjadi true
. Hal ini memungkinkannya pada awalnya, tetapi dapat diubah di masa depan dengan..
Mengalihkan tombol halaman admin
Anda dapat mengaktifkan atau menonaktifkan tiruan kapan saja dengan mengunjungi jalur yang dikonfigurasi pada mocksAdminPath
. Secara default ini adalah /admin/mocks
. Perhatikan bahwa ini terdaftar di belakang label hapi (dapat dikonfigurasi dalam pengaturan Anda, tetapi ['admin']
secara default). Hal ini memungkinkan Anda mengirimkan ejekan di situs produksi Anda, dan mengaktifkan tombol alih di port yang tidak dapat diakses publik.
Cookie di klien
Jika cookie always_ridicule
disetel dengan nilai dari forceCookieValue
yang dikonfigurasi (nilai default adalah string "true", misalnya always_ridicule="true"
) pada klien, maka tiruan yang dikonfigurasi akan selalu disajikan (sampai dihapus, tentu saja ). Selain itu, always_ridicule=false
akan memaksa klien untuk tidak pernah ditiru, apa pun pengaturan server saat ini.
Karena hapi hanya mencocokkan rute pada jalur (dan bukan parameter string kueri apa pun), Anda harus dapat mencocokkan lebih dari satu kueri dengan satu jalur. Untuk itu, ejekan menyediakan metode ridicule.validate
.
ridicule.validate
adalah fungsi yang mengambil pasangan permintaan dan balasan, kemudian objek validasi, terdiri dari objek validator
, dan fungsi callback
.
Objek validator
adalah objek biasa, yang setiap kunci mewakili kunci string kueri, dan nilainya berupa string, RegExp, atau fungsi yang cocok dengan nilai dari nilai terkait dalam string kueri.
Misalnya, string kueri berikut
?category=Music&genre=ska&year=2012
akan cocok dengan validasi berikut
...
handler : function ( request , reply ) {
ridicule . validate ( request , reply , {
validator : {
category : 'Music' ,
genre : function ( value ) {
return value === 'ska' || value === 'rocksteady'
} ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( { 'all' : 'good' } ) ;
}
} )
}
. . .
tentu saja Anda dapat dengan mudah merangkai beberapa pemeriksaan
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : {
foo : 'bar' ,
baz : 'biz'
} ,
callback : function ( request , reply ) {
reply ( { 'wordsAre' : 'hard' } ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
Anda mungkin mengalami masalah saat Anda ingin meniru sebagian permintaan Anda di titik akhir, namun tidak semuanya. Dalam hal ini, ejekan menyediakan fungsi pembantu yang berguna, ridicule.bailout
.
yang perlu Anda lakukan hanyalah menambahkannya ke akhir pemeriksaan kueri Anda, melewati antarmuka request
dan reply
penangan.
var matched = queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
if ( ! matched ) {
ridicule . bailout ( request , reply ) ;
}
Alternatif untuk ini adalah menyetel objek validator pada kueri akhir Anda ke true
. Ini secara otomatis akan cocok dengan kueri yang diberikan, dan dapat bertindak sebagai penampung semuanya
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : true ,
callback : function ( request , reply ) {
reply ( ) . file ( './catchall.json' ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;