ผู้เชี่ยวชาญ | ผู้พัฒนา |
---|---|
ปลั๊กอิน Fat Free Framework: เชื่อมโยงระหว่างโค้ดของคุณกับ REST API ภายนอก F3-wcurl ทำหน้าที่เป็นเลเยอร์นามธรรมเชิงตรรกะสำหรับ cURL ซึ่งจัดการการตรวจสอบสิทธิ์และการแคชการตอบสนองที่สำเร็จ
Web
ปลั๊กอินในตัว F3 นั้นยอดเยี่ยมและง่ายต่อการจัดการคำขอ HTTP แต่ละรายการ F3-wcurl สร้างการใช้งาน API ระยะไกลทั้งหมดภายในโค้ดของคุณ
ตลอดเวลาที่ผ่านมา ฉันจำเป็นต้องสร้างเครื่องมือและสคริปต์อย่างรวดเร็วซึ่งมีงานที่จำเป็นแต่ซ้ำซาก: เพื่อจัดการกับคำขอ cURL การตั้งค่า ออบเจ็กต์ การตอบกลับ ฯลฯ ในท้ายที่สุด ฉันยังคงคัดลอกฟังก์ชันเดิมต่อไป และแก้ไขฟังก์ชันเหล่านั้น และแก้ไขปัญหาเดียวกัน ว่าทำไมบางสิ่งถึงใช้งานไม่ได้เมื่อเขียนเมื่อหลายเดือนก่อน
แม้ว่าคุณจะสามารถควบคุมและเข้าถึงตัวเลือก cURL ได้เป็นอย่างดี แต่ F3-wcurl ไม่ได้บังคับให้คุณทำเช่นนั้น โดยให้มุ่งเน้นไปที่คำขอนั้นเอง สิ่งใดที่เปลี่ยนแปลงและรับเป็นการตอบแทน เนื่องจากเป็นปลั๊กอินสำหรับระบบนิเวศ F3 จึงมีการพึ่งพาที่ยอดเยี่ยมอยู่บ้าง เช่น Prefab
, Cache
และ Web
(ไม่ใช่สำหรับคำขอ cURL เอง)
คลาส F3 สร้างขึ้นจากอาร์เรย์ที่เชื่อมโยงของการตั้งค่าที่เกี่ยวข้อง อาร์เรย์สามารถส่งผ่านจากโค้ดใดโค้ดหนึ่งโดยตรง หรือจากไฟล์ INI (อิมพอร์ตไปยัง F3 ก่อนที่จะสร้าง F3-wcurl) และจัดเก็บไว้ในกลุ่ม F3
F3-wcurl ใช้ Prefab และ Cache ของ F3 ซึ่งอนุญาตให้เรียกวัตถุ wcurl เดียวกันได้ทุกที่จากโค้ดและการหมุนเวียนการตอบสนองที่รวดเร็ว
ตามค่าเริ่มต้น F3-wcurl จะค้นหาคีย์ wcurl
ในกลุ่ม F3 แต่ INI สามารถเก็บการตั้งค่าสำหรับการใช้งาน REST API ต่างๆ ได้อย่างสะดวกสบาย
$ wcurl = wcurl:: instance ([ $ iniName = ' wcurl ' | $ optionsArray ]);
โครงสร้างอาร์เรย์ที่ค่อนข้างเรียบง่ายนี้กำหนดการทำงานภายในของ wcurl:
ชื่อ | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
ราก | เชือก | โมฆะ | รูท API ระยะไกลซึ่งใช้ในการสร้าง URI คำขอ |
cb_login | เชือก | โมฆะ | ตั้งค่าฟังก์ชันการโทรกลับจากโค้ดของคุณ ซึ่งสามารถตรวจสอบสิทธิ์ได้ ซึ่งควรเป็นฟังก์ชันการโทรกลับที่ถูกต้องสำหรับ call_user_func() |
ทีทีแอล | จำนวนเต็ม | 60 | วินาที ระยะเวลาในการแคชการตอบกลับ GET |
ส่วนหัว | อาร์เรย์ | - | cURL อาร์เรย์ที่ถูกต้องของสตริง ["Header: value", "Another-Header: Value"] |
ตัวแทนผู้ใช้ | เชือก | เวอร์ชัน F3-wcurl | สตริง Useragent |
การตรวจสอบขั้นพื้นฐาน | เชือก | โมฆะ | ส่งส่วนหัวการตรวจสอบสิทธิ์พื้นฐาน ใช้ในรูปแบบชื่อ username:password |
โทเค็นการสืบค้น | เชือก | โมฆะ | ผนวกแต่ละคำขอด้วยโทเค็น URL |
เข้ารหัส JSON | บูลีน | จริง | สภาพอากาศทำให้เนื้อหา POST เป็นอนุกรมเป็น JSON การตั้ง false จะส่งเนื้อหาเป็นรูปแบบ HTML ปกติ |
ผมหยิก | อาร์เรย์ | - | การตั้งค่า RAW cURL อาร์เรย์การตั้งค่า RAW cURL สำหรับการควบคุมทันที โดยมี key => val โดยที่คีย์สามารถเป็นค่าคงที่หรือชื่อสตริงก็ได้ |
พัก | อาร์เรย์ | - | key => val สำหรับผู้ช่วยสร้าง URL (ดูส่วนตัวอย่าง) |
หากต้องการตั้งค่าตัวเลือกใดๆ จากตารางด้านบน ให้ส่ง key => val
array ด้วยตัวเลือกตั้งแต่หนึ่งตัวเลือกขึ้นไป
$ wcurl -> setOptions (
[
' useragent ' = > ' F3-wcurl API integration ' ,
' encodeJSON ' = > false ,
' ttl ' = > 300 ,
// etc
]
);
เฉพาะตัวเลือกที่คุณผ่านเท่านั้นที่จะได้รับการอัปเดต ส่วนอื่นๆ จะยังคงอยู่ในสถานะก่อนหน้า/ค่าเริ่มต้น
หากต้องการล้างตัวเลือกตั้งแต่หนึ่งตัวเลือกขึ้นไป ให้ระบุชื่อรหัสผ่านหรือรายการอาร์เรย์ของคีย์ที่คุณต้องการรีเซ็ตเป็นค่าเริ่มต้น:
$ wcurl -> clearOptions ([ ' useragent ' , ' ttl ' /*, ... etc */ ]);
หากต้องการรับตัวเลือกทั้งหมดที่แสดงถึงสถานะปัจจุบันของคลาส wcurl:
$ wcurl -> clearOptions ();
อาร์เรย์หลายมิติที่ส่งคืนควรเข้ากันได้เพื่อสร้างคลาสเดียวกันกับที่แยกออกมาทุกประการ
จะส่งกลับสถิติจำนวนคำขอที่ถูกดำเนินการนับตั้งแต่สร้างคลาส ได้รับการตอบกลับ http เท่าใด/เท่าใด และจำนวนที่ให้บริการจากแคช
$ wcurl -> getStats ();
ฟังก์ชันที่รองรับในปัจจุบัน ได้แก่ GET, POST, PUT, PATCH และ DELETE แม้ว่าจะเพิ่มมากขึ้นเมื่อฉันพบว่าจำเป็นต้องใช้งานมัน
$ response = $ wcurl -> get ( string $ url [, array $ fill = null [, array $ options = null ]] );
ฉันจำข้อโต้แย้งเช่นนี้
ยูเอฟโอ:
$ response = $ wcurl ->post( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - URL, เติม, เนื้อหา, ตัวเลือก
$ response = $ wcurl ->put( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - URL, เติม, เนื้อหา, ตัวเลือก
$ response = $ wcurl ->patch( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - URL, เติม, เนื้อหา, ตัวเลือก
$ response = $ wcurl ->delete( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - URL, เติม, เนื้อหา, ตัวเลือก
โต๊ะวางมีจุดประสงค์ที่สำคัญเท่าเทียมกันสองประการ:
เมื่อสร้างเส้นทาง URL ระยะไกลที่ยาว จะง่ายต่อการจดจำด้วยคำหลักสั้น ๆ โดยเฉพาะอย่างยิ่งหากมีการเรียกจากหลายแห่ง ชอบ allmembers
แทน /lists/members/all/pages
บางครั้งพารามิเตอร์เหล่านี้ก็มีพารามิเตอร์ที่ไม่ซ้ำกันด้วย ซึ่งจำเป็นต้องกรอกต่อคำขอแต่ละรายการ แนวคิดนี้เป็นหนึ่งในสาเหตุหลักว่าทำไมจึงมีปลั๊กอินนี้
อ่านต่อไป
วิธีที่ดีที่สุดคือการจัดเก็บเส้นทางระยะไกลในการกำหนดค่า . .ini
ตัวแปร URL สำหรับการเติมจะถูกล้อมด้วยสอง %
จากทั้งสองด้าน
สิ่งที่ต้องทำ: ทำให้สามารถกำหนดค่าอักขระ wrap นี้ได้
[wcurl.rests]
allmembers =/lists/members/all/pages
withVariable =/lists/members/%%memberID%%/pages
หรือส่ง key => value
ได้ทันที - มันจะถูก รวม เข้ากับการกำหนดค่าก่อนหน้า
$ wcurl -> setOptions (
' rests ' => [
' allmembers ' => ' /lists/members/all/pages ' ,
' withVariable ' => ' /lists/members/%%memberID%%/pages ' ,
' updateEmail ' => ' /lists/members/%%memberID%%/update '
]
);
หากต้องการใช้เส้นทางที่มีชื่อ ให้ส่งผ่านชื่อแทนเส้นทางแบบเต็ม
$ response = $ wcurl -> get ( ' allmembers ' );
สิ่งนี้จะแก้ไขเป็น /lists/members/all/pages
$ response = $ wcurl -> get ( ' withVariable ' , array ( ' memberID ' => ' abc123ID ' ) );
สิ่งนี้จะแก้ไขเป็น /lists/members/abc123ID/pages
หรือในคำขอ POST เรารู้ว่าต้องผ่านพารามิเตอร์ UFBO ต่อไปนี้
$ wcurl -> post ( ' updateEmail ' , // path shorthand to resolve name
[ ' memberID ' => ' abc123ID ' ], // fill this in the path
[ ' email ' => ' [email protected] ' ] // body to send
);
หากคุณใส่การกำหนดค่าทั้งหมดลงในไฟล์ ini
หลักของคุณ คลาสจะสามารถเริ่มต้นได้เฉพาะเมื่อจำเป็นต้องใช้ครั้งแรกเท่านั้น คือเมื่อโค้ดของคุณตัดสินใจส่ง get() ในขณะนั้น หากไม่ได้ลงทะเบียนคลาสใน Prefab คลาสนั้นจะถูกสร้างขึ้นจากการกำหนดค่า INI ทุกประการตามต้องการ
สำหรับรายการตัวเลือกทั้งหมด โปรดดูที่ตารางตัวเลือก Array สองสามตัวเลื่อนด้านบน
[wcurl]
root =http://mysite.api/v1
ttl =3600
cb_login =yourClass::cb_do_login
useragent = Zeus was here
headers = " Header: value " , " Another-Header: Value "
[wcurl.rests]
allmembers =/lists/members/all/pages
withVariable =/lists/members/%%memberID%%/pages
; Using with multiple API's
[apitwo]
root =http://yoursite.io/v2
ttl =60
useragent = Big Falcon Rocket
[apitwo.rests]
getUsers =/lists/members/all/pages
getOneUser =/lists/members/%%memberID%%/pages
$ wcurl -> setLogin ( callback ' yourClass::cb_do_login ' );
หากคำขอใด ๆ ส่งผลให้เกิดรหัส HTTP 401 หรือ 403 wcurl
จะเรียกใช้ฟังก์ชันการโทรกลับเข้าสู่ระบบแล้วทำซ้ำคำขอดั้งเดิม หากมีข้อผิดพลาดอีกครั้ง จะกลับสู่ผลลัพธ์ของฟังก์ชันดั้งเดิม wcurl
จัดเก็บคุกกี้ในไฟล์ชั่วคราวที่ไม่ซ้ำกับรูท API ไฟล์คุกกี้นี้รวมอยู่ในทุกคำขอ
การโทรกลับจะต้องคืนค่าเป็นจริง หากเข้าสู่ระบบสำเร็จ มิฉะนั้นจะไม่สามารถส่งคำขอซ้ำอัตโนมัติหลังจากตรวจสอบสิทธิ์สำเร็จ
น!บี! หากการเข้าสู่ระบบใช้งานไม่ได้ แต่ยังคง return true
อาจทำให้เกิดการ request->login->request->login...
infinitive loop
ตัวอย่าง ฟังก์ชั่นการเข้าสู่ระบบ
static function cb_do_login (){
$ wcurl = wcurl:: instance ();
$ login = $ wcurl -> post ( " /login " , array (
' login ' => ' my_user ' ,
' password ' => ' covfefe ' )
);
if ( $ login [ ' status ' ][ ' http_code ' ]== 200 ){
return true ;
}
// or
$ wcurl -> setOptions ( [ ' basicauth ' => " $ user : $ password " ]);
}
เมื่อเรียก wcurl::instance()
มันจะถูกส่งกลับเหมือนคลาสซิงเกิลตัน ดังนั้นในตำแหน่งใดๆ ในโค้ด จะใช้อ็อบเจ็กต์เดียวกัน หากต้องการบังคับอินสแตนซ์ใหม่จากคลาส ให้ใช้สิ่งที่ต้องการ
$ apiTwo = new wcurl ([ $ iniName | $ optionsArray ]);
จากนั้น $apiTwo
ก็สามารถเก็บไว้ในกลุ่ม F3 ได้
มีอะไรที่ต้องปรับปรุงอีกมาก แต่ขณะนี้กำลังสร้างฟีเจอร์ที่ฉันต้องการ หากมีสิ่งที่เป็นไปไม่ได้สำหรับกรณีการใช้งานของคุณ ให้ส่งปัญหาหรือแม้แต่ประชาสัมพันธ์ ขอขอบคุณนักพัฒนา F3 สำหรับเฟรมเวิร์กที่ยอดเยี่ยมนี้ หากคุณกำลังมองหาบางอย่างที่เป็น F3-wcurl แต่ไม่ได้ใช้มัน ลองคิดดูให้ดี - ทำไมคุณถึงยังไม่ใช้ F3?