API เพื่อสร้างภาพที่น่าดึงดูดของผลิตภัณฑ์ของ บริษัท ที่ทำจากช็อคโกแลตทองคำหรือเลโก้ การใช้งานอ้างอิงขึ้นอยู่กับ OpenAI (Dall-E, GPT-3)
มีผลิตภัณฑ์ของ บริษัท ที่น่าทึ่งและน่าดึงดูดใจที่ทำจากช็อคโกแลตหรือเลโก้
แรงบันดาลใจจากความสามารถในการสร้างภาพและข้อความของ OpenAI API นี้สร้างภาพของผลิตภัณฑ์ บริษัท เป็นที่รู้จักมากที่สุดและเปลี่ยนเป็นทองคำช็อคโกแลตเลโก้หรือวัสดุอื่น ๆ
ทำตามเอกสาร API ที่สร้างขึ้นและคลิกปุ่ม "Run in Postman"
เซิร์ฟเวอร์นี้ถูกสร้างขึ้นโดยใช้โครงการ OpenAPI Generator ตัวสร้างรหัสและรหัสที่สร้างขึ้นช่วยให้คุณพัฒนาระบบของคุณด้วยทัศนคติที่สำคัญอันดับแรกซึ่งสัญญา API คือจุดยึดและแน่นอนของโครงการของคุณและรหัสและธุรกิจของคุณ สัญญา API
nodejs> = 10.6
npm> = 6.10.0
รหัสถูกเขียนบน Mac ดังนั้นสมมติว่าทุกคนควรทำงานได้อย่างราบรื่นในคอมพิวเตอร์ที่ใช้ Linux อย่างไรก็ตามไม่มีเหตุผลที่จะไม่เรียกใช้ไลบรารีนี้บนเครื่องจักรที่ใช้ Windows หากคุณพบปัญหาที่เกี่ยวข้องกับระบบปฏิบัติการโปรดเปิดปัญหาและจะได้รับการแก้ไข
ใช้เครื่องกำเนิด OpenAPI เพื่อสร้างแอปพลิเคชันของคุณ: สมมติว่าคุณมี java (1.8+) และให้ขวดสร้างแอปพลิเคชันรัน: java -jar {path_to_jar_file} generate -g nodejs-express-server -i {openapi yaml/json file} -o {target_directory_where_the_app_will_be_installed}
ถ้าคุณ ไม่มีขวดหรือไม่ต้องการเรียกใช้ Java จากเครื่องในพื้นที่ของคุณทำตามคำแนะนำในหน้า OpenApitools คุณสามารถเรียกใช้สคริปต์ออนไลน์บน Docker และวิธีอื่น ๆ อีกมากมาย
ไปที่ไดเรกทอรีที่สร้างขึ้นที่คุณกำหนด มีเซิร์ฟเวอร์ NodeJS-ExpressJS ที่ทำงานได้อย่างสมบูรณ์รอคุณอยู่ นี่เป็นสิ่งสำคัญ - รหัสเป็นของคุณในการเปลี่ยนแปลงและอัปเดต! ดูที่ config.js และดูว่าการตั้งค่ามีตกลงกับคุณ - เซิร์ฟเวอร์จะทำงานบนพอร์ต 3000 และไฟล์จะถูกอัปโหลดไปยังไดเรกทอรีใหม่ 'uploaded_files'
เซิร์ฟเวอร์จะยึดตัวเองบนไฟล์ openapi.yaml ซึ่งอยู่ภายใต้ /api/openapi.yaml นี่ไม่ใช่ไฟล์เดียวกับที่คุณใช้ในการสร้างแอพ: I. หากคุณมี application/json
ContentBody ที่กำหนดไว้ในวัตถุเส้นทาง - การสร้างจะย้ายไปยังส่วนประกอบ/schemas ของเอกสาร OpenAPI ii. ทุกกระบวนการมีองค์ประกอบใหม่ที่เพิ่มเข้ามา-X x-eov-operation-handler: controllers/PetController
ซึ่งนำการโทรไปยังไฟล์นั้น iii. เรามีแอปพลิเคชัน Java ที่แปล OperationID เป็นวิธีการและสคริปต์ NodeJS ที่ทำกระบวนการเดียวกันเพื่อเรียกวิธีการนั้น ทั้งสองกำลังแปลงวิธีการเป็น camelCase
แต่อาจมีความคลาดเคลื่อน โปรดให้ความสนใจกับชื่อ OperationID และดูว่าพวกเขามีตัวแทนใน controllers
และไดเรกทอรี services
ใช้เวลาในการทำความเข้าใจโครงสร้างของแอปพลิเคชัน อาจมีข้อบกพร่องและอาจมีการตั้งค่าและธุรกิจ-หลักทรัพย์ที่ไม่ตรงกับความคาดหวังของคุณ แทนที่จะทิ้งโซลูชันนี้และมองหาอย่างอื่น - ดูว่าคุณสามารถทำให้รหัสที่สร้างขึ้นได้สำหรับคุณหรือไม่ เพื่อให้คำอธิบายสั้น ๆ (คำอธิบายโดยละเอียดเพิ่มเติมจะตามมา): แอปพลิเคชันเริ่มต้นด้วยการโทรไปยัง index.js (นี่คือที่ที่คุณจะเสียบในวันที่ DB ในภายหลัง) มันเรียกว่า expressserver.js ซึ่งเป็นที่ที่ express.js และ openapi-validator เตะเข้านี่เป็นไฟล์สำคัญ เรียนรู้ การโทรไปยังจุดสิ้นสุดทั้งหมดที่กำหนดค่าในเอกสาร openapi.yaml ไปที่ controllers/{name_of_tag_which_the_operation_was_associated_with}.js
ซึ่งเป็นวิธีที่เล็กมาก ธุรกิจทั้งหมดอยู่ใน controllers/Controller.js
และจากที่นั่น - ไปยัง services/{name_of_tag_which_the_operation_was_associated_with}.js
เมื่อคุณเข้าใจว่า จะ เกิดอะไรขึ้นให้เปิดแอปและให้แน่ใจว่าทุกอย่างทำงานได้ตามที่คาดไว้:
npm start
(สมมติว่าไม่มีการเปลี่ยนแปลงใด ๆ กับ config.js)
เอกสาร API และเพื่อตรวจสอบจุดสิ้นสุดที่มีอยู่: http: // localhost: 3000/api-docs/ ถึง
ดาวน์โหลดเอกสาร openapi.yaml: http: // localhost: 3000/openapi
ทุกการโทรไปยังจุดสิ้นสุดที่กำหนดไว้ในเอกสาร OpenAPI จะส่งคืน 200 และรายการพารามิเตอร์และวัตถุทั้งหมดที่ส่งในคำขอ
จุดสิ้นสุดที่ต้องการความปลอดภัยจำเป็นต้องมีตัวจัดการความปลอดภัยที่กำหนดค่าก่อนที่พวกเขาจะสามารถส่งคืนการตอบกลับที่ประสบความสำเร็จ ณ จุดนี้พวกเขาจะส่งคืนรหัสตอบกลับ 401
ในไดเรกทอรีรูทเรามี (นอกเหนือจาก package.json, config.js และไฟล์บันทึก):
logger.js - ที่ที่เรากำหนด logger สำหรับโครงการ โครงการใช้ Winston แต่จุดประสงค์ของไฟล์นี้คือเพื่อให้ผู้ใช้สามารถเปลี่ยนแปลงและแก้ไขพฤติกรรมของตัวบันทึกของตนเองได้
index.js - นี่คือไฟล์ 'หลัก' ของโครงการและจากที่นี่เราเปิดแอปพลิเคชัน นี่เป็นไฟล์ที่สั้นและรัดกุมมากและแนวคิดที่อยู่เบื้องหลังการเปิดตัวจากไฟล์สั้นนี้คือการอนุญาตให้ใช้กรณีการใช้งานเซิร์ฟเวอร์ด้วยพารามิเตอร์ที่แตกต่างกัน (เปลี่ยน config และ/หรือ logger) โดยไม่ส่งผลต่อส่วนที่เหลือของรหัส
Expressserver.js - แกนกลางของเซิร์ฟเวอร์ Express.js นี่คือที่ที่เซิร์ฟเวอร์ด่วนเริ่มต้นพร้อมกับตัวตรวจสอบ OpenAPI, OpenAPI UI และไลบรารีอื่น ๆ ที่จำเป็นในการเริ่มต้นเซิร์ฟเวอร์ของเรา หากเราต้องการเพิ่มลิงก์ภายนอกนั่นคือที่ที่พวกเขาจะไป โครงการของเราใช้ไลบรารี Express-Openapi-Validator ที่ทำหน้าที่เป็นขั้นตอนแรกในกระบวนการกำหนดเส้นทาง-คำขอที่นำไปยังเส้นทางที่กำหนดไว้ในไฟล์ openapi.yaml
ถูกจับโดยกระบวนการนี้และพารามิเตอร์และ bodycontent ได้รับการตรวจสอบ . ผลลัพธ์ที่ประสบความสำเร็จของการตรวจสอบความถูกต้องนี้จะเป็นวัตถุ 'OpenAPI' ใหม่ที่เพิ่มเข้ามาในคำขอ หากเส้นทางที่ร้องขอไม่ได้เป็นส่วนหนึ่งของไฟล์ OpenAPI.YAML ตัวตรวจสอบจะละเว้นคำขอและส่งต่อไปตามที่ไหลลงของการไหลของเซิร์ฟเวอร์ด่วน
openapi.yaml - นี่คือสัญญา OpenAPI ที่เซิร์ฟเวอร์นี้จะปฏิบัติตาม ไฟล์ถูกสร้างขึ้นโดยใช้ codegen และควรมีทุกอย่างที่จำเป็นในการเรียกใช้ API Gateway - ไม่มีการอ้างอิงถึงโมเดล/schemas ภายนอก
ปัจจุบันไฟล์เดียว:
openapirouter.js - นี่คือที่ที่การกำหนดเส้นทางไปยังรหัสแบ็คเอนด์ของเราเกิดขึ้น หากวัตถุคำขอมีวัตถุ openapi
จะเลือกค่าต่อไปนี้ (ซึ่งเป็นส่วนหนึ่งของไฟล์ openapi.yaml
): 'X-Openapi-Router-Controller' และ 'X-Openapi-Router-Service' ตัวแปรเหล่านี้เป็นชื่อของไฟล์/คลาสในตัวควบคุมและไดเรกทอรีบริการตามลำดับ การดำเนินการของคำขอจะถูกสกัดด้วย OperationID เป็นวิธีการในคอนโทรลเลอร์และบริการที่สร้างขึ้นเป็นส่วนหนึ่งของกระบวนการ codegen กระบวนการกำหนดเส้นทางจะส่งวัตถุคำขอและการตอบกลับไปยังคอนโทรลเลอร์ซึ่งจะแยกตัวแปรที่คาดหวังออกจากคำขอและส่งไปยังบริการโดยบริการส่งคืนการตอบกลับจากบริการไปยังผู้โทร
หลังจากตรวจสอบความถูกต้องของคำขอและตรวจสอบให้แน่ใจว่าสิ่งนี้เป็นของเกตเวย์ API ของเราเราส่งคำขอไปยัง controller
ซึ่งตัวแปรและพารามิเตอร์ถูกดึงออกมาจากคำขอและส่งไปยัง service
ที่เกี่ยวข้องสำหรับการประมวลผล controller
จัดการการตอบสนองจาก service
และสร้างการตอบสนอง HTTP ที่เหมาะสมเพื่อส่งกลับไปยังผู้ใช้
index.js - โหลดคอนโทรลเลอร์ทั้งหมดที่สร้างขึ้นสำหรับโครงการนี้และส่งออกเพื่อใช้งานแบบไดนามิกโดย openapiRouter.js
หากคุณต้องการปรับแต่งคอนโทรลเลอร์ของคุณขอแนะนำให้คุณเชื่อมโยงไปยังคอนโทรลเลอร์ของคุณที่นี่และตรวจสอบให้แน่ใจว่า codegen ไม่ได้เขียนไฟล์นี้ใหม่
controller.js - โปรเซสเซอร์หลักของคอนโทรลเลอร์ที่สร้างขึ้น คอนโทรลเลอร์ที่สร้างขึ้นได้รับการออกแบบให้มีความบางและทั่วไปมากที่สุดโดยอ้างอิงไปยัง Controller.js
สำหรับตรรกะทางธุรกิจของการแยกวิเคราะห์ตัวแปรและอาร์กิวเมนต์ที่ต้องการจากคำขอและสำหรับการสร้างการตอบสนอง HTTP ซึ่งจะถูกส่งกลับ Controller.js
เป็นคลาสที่มีวิธีการคงที่
.JS - รหัสที่สร้างโดยอัตโนมัติประมวลผลการดำเนินการทั้งหมด คอนโทรลเลอร์เป็นคลาสที่สร้างขึ้นด้วยคลาสบริการที่จะส่งคำขอไป ทุกคำขอที่กำหนดโดย openapi.yaml
มี OperationID OperationId เป็นชื่อของวิธีการที่จะเรียก ทุกวิธีจะได้รับการร้องขอและการตอบสนองและเรียก Controller.js
เพื่อประมวลผลคำขอและการตอบกลับเพิ่มวิธีการบริการที่ควรเรียกร้องให้มีการประมวลผลทางธุรกิจที่แท้จริง
นี่คือที่ที่เกตเวย์ API สิ้นสุดลงและธุรกิจที่เป็นเอกลักษณ์ของแอปพลิเคชันของคุณเริ่มขึ้นทุกจุดสิ้นสุดใน openapi.yaml
มีตัวแปร 'X-Openapi-Router-Service' ซึ่งเป็นชื่อของคลาสบริการที่เป็น สร้าง OperationId ของจุดสิ้นสุดคือชื่อของวิธีการที่จะเรียก รหัสที่สร้างขึ้นให้คำสัญญาง่ายๆด้วยประโยคลอง/จับ การดำเนินการที่ประสบความสำเร็จจบลงด้วยการโทรไปยัง Service.js
ทั่วไป js เพื่อสร้างการตอบกลับที่ประสบความสำเร็จ (รหัสการส่งและรหัสตอบกลับ) และความล้มเหลวจะเรียกใช้ Service.js
ทั่วไป js เพื่อสร้างการตอบกลับด้วยวัตถุข้อผิดพลาดและรหัสตอบกลับที่เกี่ยวข้อง ขอแนะนำให้สร้างบริการโดยอัตโนมัติหนึ่งครั้งและหลังจากวิธีการสร้างเริ่มต้นด้วยตนเอง
index.js - โหลดบริการทั้งหมดที่สร้างขึ้นสำหรับโครงการนี้และส่งออกเพื่อใช้งานแบบไดนามิกโดย openapiRouter.js
หากคุณต้องการปรับแต่งบริการของคุณขอแนะนำให้คุณเชื่อมโยงไปยังคอนโทรลเลอร์ของคุณที่นี่และตรวจสอบให้แน่ใจว่า codegen ไม่ได้เขียนไฟล์นี้ใหม่
Service.js - คลาสยูทิลิตี้ง่ายและบางมาก ณ จุดนี้ด้วยสองวิธีแบบคงที่สำหรับการสร้างวัตถุตอบสนองสำหรับผลลัพธ์ที่ประสบความสำเร็จและล้มเหลวในการดำเนินการบริการ รหัสตอบกลับเริ่มต้นคือ 200 สำหรับความสำเร็จและ 500 สำหรับความล้มเหลว ขอแนะนำให้ส่งรหัสการตอบกลับที่แม่นยำยิ่งขึ้นและแทนที่ค่าเริ่มต้นเหล่านี้เมื่อเกี่ยวข้อง
.js - รหัสที่สร้างโดยอัตโนมัติซึ่งให้คำมั่นสัญญากับต้นขั้วสำหรับการดำเนินการแต่ละครั้งที่กำหนดไว้ใน openapi.yaml
แต่ละวิธีจะได้รับตัวแปรที่กำหนดไว้ในไฟล์ openapi.yaml
และสรุปสัญญาในประโยคลอง/จับ สัญญาจะแก้ไขทั้งความสำเร็จและความล้มเหลวในการโทรไปยังคลาสยูทิลิตี้ Service.js
สำหรับการสร้างการตอบสนองที่เหมาะสมซึ่งจะถูกส่งกลับไปยังคอนโทรลเลอร์และจากนั้นไปยังผู้โทรของจุดสิ้นสุดนี้
servertests.js - การทดสอบการตรวจสอบความถูกต้องของเซิร์ฟเวอร์ขั้นพื้นฐานตรวจสอบว่าเซิร์ฟเวอร์นั้นขึ้นอยู่กับการโทรไปยังจุดสิ้นสุดภายในขอบเขตของไฟล์ openapi.yaml
ส่งคืน 200 ซึ่งการโทรไปยังเส้นทางที่อยู่ด้านนอกขอบเขตนั้นจะส่งกลับ 200 หากมีอยู่และ A 404 ถ้าไม่
RoutingTests.js - วิ่งผ่านจุดสิ้นสุดทั้งหมดที่กำหนดไว้ใน openapi.yaml
และสร้างคำขอจำลองเพื่อส่งไปยังเซิร์ฟเวอร์ ยืนยันว่ารหัสตอบกลับคือ 200 ณ จุดนี้คำขอที่มี XML หรือ FormData ล้มเหลว - ปัจจุบันพวกเขายังไม่ได้รับการสนับสนุนในเราเตอร์
เพิ่มเติม endpointstests.js - ไฟล์ทดสอบสำหรับจุดสิ้นสุดทั้งหมดที่กำหนดไว้นอกขอบเขต openapi.yaml ยืนยันว่าจุดสิ้นสุดเหล่านี้ส่งคืนการตอบกลับ 200 ครั้งที่ประสบความสำเร็จ
ควรเขียนการทดสอบในอนาคตเพื่อให้แน่ใจว่าการตอบสนองของทุกคำขอที่ส่งควรสอดคล้องกับโครงสร้างที่กำหนดไว้ใน openapi.yaml
การทดสอบนี้จะล้มเหลวในตอนแรก 100% และงานของทีมพัฒนาจะล้างการทดสอบเหล่านี้
ปัจจุบันแนวคิดกำลังรอข้อเสนอแนะ แนวคิดคือการให้วัตถุที่กำหนดไว้ใน OpenAPI.YAML ทำหน้าที่เป็นแบบจำลองที่ผ่านระหว่างโมดูลที่แตกต่างกัน สิ่งนี้จะสอดคล้องกับโปรแกรมเมอร์ให้โต้ตอบโดยใช้วัตถุที่กำหนดไว้แทนที่จะเป็นวัตถุ JSON ที่กำหนดไว้อย่างหลวม ๆ ด้วยลักษณะของโปรแกรมเมอร์ JavaScript ที่ต้องการทำงานกับพารามิเตอร์ bootstrapped ของตัวเองแนวคิดนี้อาจไม่ทำงาน เก็บไว้ที่นี่เพื่อการอภิปรายและข้อเสนอแนะในอนาคต