ปลั๊กอิน hapi ที่ให้การเยาะเย้ยสำหรับ API ที่ใช้การสืบค้นและพักผ่อน
ประกาศ: การสนับสนุนสำหรับโครงการนี้สิ้นสุดลงแล้ว
โปรเจ็กต์นี้เป็นเจ้าของและดูแลโดย Walmart โปรเจ็กต์นี้สิ้นสุดอายุการใช้งานแล้วและ Walmart ไม่สนับสนุนโปรเจ็กต์นี้อีกต่อไป
เราจะไม่ติดตามปัญหาสำหรับโปรเจ็กต์นี้หรือตรวจสอบคำขอดึงอีกต่อไป คุณมีอิสระที่จะใช้โปรเจ็กต์นี้ต่อไปภายใต้ข้อกำหนดสิทธิ์การใช้งานหรือทางแยกของโปรเจ็กต์นี้โดยยอมรับความเสี่ยงเอง โปรเจ็กต์นี้ไม่อยู่ภายใต้โปรแกรมรางวัลจุดบกพร่องของ Walmart หรือการตรวจสอบความปลอดภัยอื่นๆ อีกต่อไป
เราขอแนะนำให้คุณดำเนินการต่อไปนี้:
ด้วยเหตุผลด้านความปลอดภัย Walmart จะไม่โอนความเป็นเจ้าของ repos หลักของเราบน Github หรือแพลตฟอร์มอื่น ๆ ให้กับบุคคล/องค์กรอื่น นอกจากนี้ เราไม่โอนความเป็นเจ้าของแพ็คเกจสำหรับระบบการจัดการแพ็คเกจสาธารณะ
หากคุณต้องการแยกแพ็คเกจนี้และพัฒนาต่อไป คุณควรเลือกชื่อใหม่สำหรับโปรเจ็กต์และสร้างแพ็คเกจของคุณเอง สร้างระบบอัตโนมัติ ฯลฯ
โปรดตรวจสอบข้อกำหนดการอนุญาตให้ใช้สิทธิของโปรเจ็กต์นี้ ซึ่งยังคงมีผลใช้อยู่แม้ว่าจะเลิกใช้งานไปแล้วก็ตาม##curved-carousel
วิธีง่ายๆ ในการสร้างภาพหมุนที่เลื่อนได้ไม่จำกัด พร้อมตัวเลือกส่วนโค้ง
ตัวเลือกต่อไปนี้มีไว้สำหรับการกำหนดค่า
apiPrefix
สตริงหรืออาร์เรย์ของสตริงที่แสดงถึงฐานของเส้นทางที่ควรจำลอง
ค่าเริ่มต้นเป็น /api
mocksDir
ไดเร็กทอรีที่มีไฟล์จำลอง
ค่าเริ่มต้นคือ __dirname + './mocks'
โดยที่ __dirname คือปลั๊กอินนี้
mocksAdminPath
URL ที่เกี่ยวข้องซึ่งสามารถพบหน้าผู้ดูแลระบบสำหรับปลั๊กอินนี้ได้
ค่าเริ่มต้นเป็น /admin/mocks
mocksAdminServerLabels
อาร์เรย์ของป้ายกำกับที่ใช้ระหว่างการลงทะเบียนปลั๊กอินของ hapi
ค่าเริ่มต้นเป็น ['admin']
enabled
ไม่ว่าจะเปิดใช้งานการเยาะเย้ยหรือไม่ก็ตาม
ค่าเริ่มต้นเป็น false
enableForceCookiePage
บูลีนที่แสดงถึงว่าจะลงทะเบียนหน้าตัวตั้งค่าคุกกี้หรือไม่ หน้านี้จะมีปุ่มง่ายๆ เพื่อเปิดหรือปิดคุกกี้ always_ridicule
ซึ่งช่วยให้ไคลเอ็นต์สามารถเลือกบังคับการตอบสนองจำลองได้ โดยไม่คำนึงถึงการตั้งค่าเซิร์ฟเวอร์ มีประโยชน์สำหรับผู้ทดสอบมือใหม่หรืออุปกรณ์ที่การสร้าง bookmarklet นั้นยุ่งยาก ค่าเริ่มต้นเป็น false
forceCookiePath
URL ที่เกี่ยวข้องซึ่งหน้าตัวตั้งค่าคุกกี้สามารถพบได้ที่
ค่าเริ่มต้นเป็น /cookie
forceCookieValue
สตริงที่แสดงถึงค่าของคุกกี้ always_ridicule
อนุญาตให้เซิร์ฟเวอร์มีวิธีเยาะเย้ยการเลือกใช้ที่เปิดเผยต่อสาธารณะโดยไม่ต้องเปิดเผยคุกกี้ที่จำเป็นโดยเฉพาะต่อสาธารณะ ค่า expires
คือ 30 นาทีนับจากเวลาที่ตั้งไว้
ค่าเริ่มต้นเป็น "true"
ภายใน mocksDir
ของคุณ ให้สร้างไฟล์ ridicule.js
ที่เปิดเผยเส้นทาง Hapi ของอาร์เรย์ใน module.exports
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' ) ;
}
} ]
เมื่อเริ่มต้นเซิร์ฟเวอร์ เส้นทางที่กำหนดค่าไว้ทั้งหมดจะถูกลงทะเบียนด้วยคำนำหน้าแบบสุ่ม 40 ตัว (เช่นเส้นทาง /foo
ถูกล้อเลียนที่ /(uuid)/foo
)
เมื่อเปิดใช้งานเซิร์ฟเวอร์จำลอง คำขอขาเข้าทั้งหมดจะถูกจับคู่กับ apiPrefix
ที่กำหนดค่าไว้ เมื่อพบรายการที่ตรงกัน คำขอจะถูกส่งต่อภายในไปยังตัวจัดการเส้นทางจำลอง
คุณมีความสามารถในการช่วยเหลือในการเยาะเย้ยคำขอในตัวจัดการ (มีประโยชน์เมื่อคุณกำลังเยาะเย้ยเฉพาะชุดย่อยของระบบที่ใช้สตริงการสืบค้น เนื่องจาก hapi จับคู่บนเส้นทางเท่านั้น) เพียง require
การเยาะเย้ยในไฟล์ จากนั้นเรียก ridicule.bailout(req, res)
โดยที่ req
และ res
เป็นอ็อบเจ็กต์คำขอและการตอบสนองภายในตัวจัดการ
วิธีการเยาะเย้ยคำขอที่พบบ่อยที่สุดคือเพียงส่งคืนข้อมูลของไฟล์ json ภายในอินเทอร์เฟซ reply()
ของตัวจัดการเส้นทางของคุณ
var data = require ( './mockFile.json' ) ;
var route = {
method : '*' ,
path : '/mockPath' ,
config : {
handler : function ( request , reply ) {
return reply ( data ) ;
}
}
} ;
อย่างไรก็ตาม คุณสามารถเพิ่มข้อมูลเมตาเพิ่มเติมในการตอบกลับได้ เช่น ส่วนหัวที่กำหนดเองและรหัสสถานะ HTTP คุณเพียงแค่ต้องรวมไฟล์ json ที่มีอยู่ของคุณไว้ภายในออบเจ็กต์อื่น ตั้งค่าต้นฉบับเป็น payload
และเพิ่มฟิลด์ ridiculeSettings
ดังนั้นคำขอนี้
{
"foo" : " bar "
}
กลายเป็น
{
"ridiculeSettings" : {
"statusCode" : 418 ,
"headers" : { "Content-Type" : " x-stream " }
}
payload: {
"foo" : " bar "
}
}
เป็นที่น่าสังเกตว่าเนื่องจากสิ่งนี้ถูกเพิ่มไว้ที่ส่วนท้ายสุดของโฟลว์คำขอของ hapi ด้วยเหตุนี้ เนื่องจาก payload
จะต้องถูกอินไลน์ในไฟล์จำลอง ดังนั้นจึงจำกัดไว้เพียงรองรับเฉพาะสตริงและอ็อบเจ็กต์ JSON เท่านั้น ไม่ใช่สตรีมหรือบัฟเฟอร์
มีสามวิธีในการเปิด/ปิดการจำลอง
การตั้งค่าการกำหนดค่า Hapi
คุณสามารถเปลี่ยนตัวเลือก enabled
ในการตั้งค่าของคุณเป็น true
สิ่งนี้เปิดใช้งานได้ตั้งแต่เริ่มต้น แต่สามารถเปลี่ยนแปลงได้ในอนาคตโดย..
สลับปุ่มหน้าผู้ดูแลระบบ
คุณสามารถเปิดหรือปิดการจำลองได้ตลอดเวลาโดยไปที่เส้นทางที่กำหนดค่าไว้ภายใต้ mocksAdminPath
ตามค่าเริ่มต้น นี่คือ /admin/mocks
โปรดทราบว่าสิ่งนี้มีการลงทะเบียนไว้หลังป้ายกำกับ hapi (กำหนดค่าได้ในการตั้งค่าของคุณ แต่เป็น ['admin']
ตามค่าเริ่มต้น) วิธีนี้ช่วยให้คุณสามารถส่งการเยาะเย้ยในไซต์การผลิตของคุณ และมีสวิตช์สลับอยู่บนพอร์ตที่ไม่สามารถเข้าถึงได้โดยสาธารณะ
คุกกี้บนไคลเอนต์
หากคุกกี้ always_ridicule
ถูกตั้งค่าด้วยค่าจาก forceCookieValue
ที่กำหนดค่าไว้ (ค่าเริ่มต้นคือสตริง "true" เช่น always_ridicule="true"
) บนไคลเอนต์ ดังนั้นการจำลองที่กำหนดค่าไว้จะถูกให้บริการเสมอ (จนกว่าจะถูกลบแน่นอน) ). นอกจากนี้ always_ridicule=false
จะบังคับให้ไคลเอนต์ไม่ถูกเยาะเย้ย ไม่ว่าการตั้งค่าปัจจุบันของเซิร์ฟเวอร์จะเป็นอย่างไร
เนื่องจาก hapi จับคู่เส้นทางบนเส้นทางเท่านั้น (ไม่ใช่พารามิเตอร์สตริงการสืบค้น) คุณจึงต้องสามารถจับคู่การสืบค้นมากกว่าหนึ่งรายการกับเส้นทางได้ เพื่อสิ่งนั้น การเยาะเย้ยจัดให้มีวิธี ridicule.validate
ridicule.validate
เป็นฟังก์ชันที่รับคู่คำขอและตอบกลับ จากนั้นจึงเป็นออบเจ็กต์การตรวจสอบ ซึ่งประกอบด้วยออบเจ็กต์ validator
และฟังก์ชัน callback
ออบเจ็กต์ validator
คือออบเจ็กต์ธรรมดา โดยแต่ละคีย์แสดงถึงคีย์ของสตริงการสืบค้น และค่านั้นเป็นสตริง RegExp หรือฟังก์ชันที่ตรงกับค่าของค่าที่สอดคล้องกันในสตริงการสืบค้น
ตัวอย่างเช่น สตริงการสืบค้นต่อไปนี้
?category=Music&genre=ska&year=2012
จะตรงกับการตรวจสอบต่อไปนี้
...
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' } ) ;
}
} )
}
. . .
แน่นอนคุณสามารถเชื่อมโยงเช็คหลายรายการได้อย่างง่ายดาย
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 ) ;
} ) ;
คุณอาจพบปัญหาที่คุณต้องการเยาะเย้ยชุดย่อยของคำขอของคุณที่ปลายทาง แต่ไม่ใช่ทั้งหมด ในกรณีนี้ การเยาะเย้ยมีฟังก์ชันตัวช่วยที่มีประโยชน์คือ ridicule.bailout
สิ่งที่คุณต้องทำคือเพิ่มมันลงที่ส่วนท้ายของการตรวจสอบการสืบค้นของคุณ โดยผ่านอินเทอร์เฟซ request
และ reply
ของตัวจัดการ
var matched = queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
if ( ! matched ) {
ridicule . bailout ( request , reply ) ;
}
อีกทางเลือกหนึ่งคือการตั้งค่าออบเจ็กต์เครื่องมือตรวจสอบในการสืบค้นสุดท้ายของคุณเป็น true
ซึ่งจะจับคู่คำค้นหาที่ให้มาโดยอัตโนมัติ และสามารถทำหน้าที่เป็นตัวรับทั้งหมดได้
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 ) ;
} ) ;