Api2go: JSONAPI.org การดำเนินการสำหรับ Go
api2go
การใช้งาน JSON API สำหรับ Go ที่จะใช้เช่น เป็นเซิร์ฟเวอร์สำหรับ Ember Data
การติดตั้ง
สำหรับการใช้งานแพ็คเกจ api2go ที่สมบูรณ์:
|_+_|หากคุณต้องการเพียงการจัดเรียงและ/หรือยกเลิกการจัดเรียง:
|_+_|ฟังก์ชันพื้นฐาน
Api2go จะ Marshal/Unmarshal เหมือนกับภายใน |_+_| แพ็คเกจจาก Go ด้วยการเพิ่มหนึ่งอย่าง: มันจะตกแต่ง Marshalled json ด้วยเมตาวัตถุ jsonapi Jsonapi ห่อ payload ไว้ใน |_+_| วัตถุ. ส่วนที่เหลือเป็นเพียง Meta-Data ซึ่งจะถูกสร้างโดย api2go
ลองมาดูตัวอย่างพื้นฐานนี้:
หาซื้อได้ที่ไหน steem coin|_+_|
จะ |_+_| ใน Json นี้:
|_+_|สำหรับ api2go คุณต้องละเว้นแท็ก |_+_| ฟิลด์แล้วผลลัพธ์อาจเป็นดังนี้:
|_+_|ดึงข้อมูลเพิ่มเติมทั้งหมดได้โดยใช้อินเทอร์เฟซบางตัว
ตัวอย่าง
- ตัวอย่างพื้นฐานสามารถพบได้ที่นี่
- สำหรับตัวอย่างการใช้งานจริงของ api2go โดยใช้ jinzhu/gorm และ gin-gonic/gin คุณสามารถดูที่ repository ของ hnakamur
อินเทอร์เฟซที่จะใช้
สำหรับตัวอย่างข้อความค้นหาและผลลัพธ์ต่อไปนี้ ลองจินตนาการถึง 2 โครงสร้างต่อไปนี้ซึ่งแสดงถึงโพสต์และความคิดเห็นที่เป็นของความสัมพันธ์แบบ has-many กับโพสต์
|_+_|อย่างน้อยคุณต้องดำเนินการ ตัวระบุจอมพล อินเทอร์เฟซซึ่งเป็นอินเทอร์เฟซสำหรับการจัดเรียง/ยกเลิกการจัดเรียงหลัก |_+_| ของโครงสร้างที่คุณต้องการจัดวาง/ยกเลิกการจัดวาง นี่เป็นเพราะประเภทต่างๆ มากมายที่คุณสามารถใช้เป็น ID หลักได้ ตัวอย่างเช่น สตริง, UUID หรือ BSON Object สำหรับ MongoDB เป็นต้น...
ในโครงสร้างตัวอย่างโพสต์ |_+_| ฟิลด์นี้จะถูกละเว้นเนื่องจาก api2go จะใช้ |_+_| วิธีการที่คุณใช้กับโครงสร้างของคุณเพื่อดึง ID ของโครงสร้าง ทุกฟิลด์ภายใน struct จะถูกรวมเข้ากับ |_+_| วัตถุใน json ในตัวอย่างของเรา เราแค่ต้องการมี |_+_| สนามที่นั่น
อย่าลืมตั้งชื่อฟิลด์ทั้งหมดของคุณด้วยเครื่องหมาย |_+_| แท็ก
ตอบกลับ
|_+_|ต้องใช้งานอินเทอร์เฟซตัวตอบกลับหากคุณใช้ API ของเรา ประกอบด้วยทุกสิ่งที่จำเป็นสำหรับการตอบสนอง คุณสามารถดูตัวอย่างการใช้งานในโครงการตัวอย่างของเรา
EntityNamer
|_+_|EntityNamer เป็นอินเทอร์เฟซทางเลือก โดยปกติ ชื่อของโครงสร้างจะถูกสร้างขึ้นโดยอัตโนมัติในรูปแบบพหูพจน์ ตัวอย่างเช่น ถ้าโครงสร้างของคุณมีประเภท |_+_| ชื่อที่สร้างขึ้นคือ |_+_| และ URL สำหรับคำขอ GET สำหรับโพสต์ที่มีรหัส 1 จะเป็น |_+_|
หากคุณใช้ |_+_| เมธอดและส่งกลับ |_+_| นี่จะเป็นชื่อใน |_+_| ฟิลด์ของ json ที่สร้างขึ้นและชื่อสำหรับเส้นทางที่สร้างขึ้นด้วย
ในปัจจุบัน คุณต้องใช้อินเทอร์เฟซนี้ หากคุณมีประเภทโครงสร้างที่ประกอบด้วยหลายคำ และคุณต้องการใช้ a ยัติภังค์ ชื่อ. ตัวอย่างเช่น |_+_| จากนั้น Jsonifier เริ่มต้นของเราจะสร้างชื่อ |_+_| แต่ถ้าอยากได้ชื่อที่แนะนำ ต้อง Implement |_+_|
|_+_|ตัวระบุจอมพล
|_+_|ใช้อินเทอร์เฟซนี้เพื่อจัดการโครงสร้าง
UnmarshalIdentifier
|_+_|นี่คืออินเทอร์เฟซที่สอดคล้องกับ MarshalIdentifier ใช้อินเทอร์เฟซนี้เพื่อแยก json ขาเข้าออกเป็นโครงสร้าง
การมาร์แชลโดยอ้างอิงถึงโครงสร้างอื่น
สำหรับความสัมพันธ์ในการทำงาน มี 3 อินเทอร์เฟซที่คุณสามารถใช้ได้:
|_+_|การใช้อินเทอร์เฟซเหล่านี้ไม่จำเป็นและขึ้นอยู่กับกรณีการใช้งานของคุณ หาก API ของคุณมีความสัมพันธ์ คุณต้องใช้ |_+_| เป็นอย่างน้อย และ |_+_|
|_+_| จะต้องดำเนินการเพื่อให้ api2go รู้ว่าความสัมพันธ์ใดที่เป็นไปได้สำหรับโครงสร้างของคุณ
|_+_| ต้องดำเนินการเพื่อดึงข้อมูล |_+_| ของความสัมพันธ์ที่เชื่อมต่อกับโครงสร้างนี้ เมธอดนี้ยังสามารถคืนค่าอาร์เรย์ว่าง หากไม่มีความสัมพันธ์ใดๆ อยู่ในขณะนี้ ด้วยเหตุนี้จึงมี |_+_| อินเทอร์เฟซ เพื่อให้ api2go รู้ว่าอะไรเป็นไปได้ แม้ว่าจะไม่มีการอ้างอิงในขณะนั้นก็ตาม
นอกจากนั้น คุณสามารถใช้ |_+_| ซึ่งส่งออกโครงสร้างอ้างอิงที่สมบูรณ์และฝังไว้ในผลลัพธ์ json ภายใน |_+_| วัตถุ.
ด้วยวิธีนี้คุณสามารถเลือกวิธีจัดการความสัมพันธ์ภายในได้ ดังนั้นจึงไม่มีข้อจำกัดเกี่ยวกับการใช้ ORM
Unmarshalling กับการอ้างอิงถึง struct อื่น
jsons ที่เข้ามายังสามารถมีรหัสอ้างอิง คุณต้องใช้อินเทอร์เฟซต่อไปนี้ หากคุณมีความสัมพันธ์แบบหนึ่งเดียว |_+_| อินเทอร์เฟซเพียงพอ
|_+_|หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้อินเทอร์เฟซ โปรดดูการทดสอบของเราหรือโครงการตัวอย่าง
การจัดเรียง / ยกเลิกการจัดเรียงด้วยตนเอง
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะเมื่อคุณใช้อินเทอร์เฟซที่กล่าวถึงก่อนหน้านี้เท่านั้น การจัดเรียงและยกเลิกการจัดเรียงด้วยตนเองนั้นสมเหตุสมผล หากคุณไม่ต้องการใช้ API ของเราที่จะสร้างเส้นทางที่จำเป็นทั้งหมดให้คุณโดยอัตโนมัติ คุณสามารถใช้แพ็คเกจย่อยของเราได้โดยตรง |_+_|
|_+_|จะให้ผล
|_+_|คุณยังสามารถใช้ |_+_| เพื่อสร้าง URL โดยอัตโนมัติสำหรับปลายทางที่เหลือที่มีเวอร์ชันและคำนำหน้า BaseURL สิ่งนี้จะสร้างเส้นทางเดียวกับที่ API ของเราใช้ สิ่งนี้เพิ่ม |_+_| และ |_+_| ช่องสำหรับความสัมพันธ์ภายใน |_+_| วัตถุ.
กู้คืนโครงสร้างจากด้านบนโดยใช้ โปรดทราบว่าการยกเลิกการจัดเรียงข้อมูลด้วยโครงสร้างที่รวมอยู่นั้นยังใช้งานไม่ได้ ดังนั้นจึงยังไม่สามารถใช้ Api2go เป็นไคลเอนต์ได้
|_+_|SQL Null-ประเภท
เมื่อใช้ฐานข้อมูล SQL เป็นไปได้มากว่าคุณต้องการใช้ SQL-Types พิเศษจาก |_+_| บรรจุุภัณฑ์. เหล่านี้คือ
- sql.NullBool
- sql.NullFloat64
- sql.NullInt64
- sql.NullString
ปัญหาคือ พวกเขาจัดการ |_+_| เป็นการภายใน พฤติกรรมค่าโดยใช้โครงสร้างที่กำหนดเอง ในการ Marshal และ Unmarshal ค่าเหล่านี้ จำเป็นต้องดำเนินการ |_+_| และ |_+_| อินเทอร์เฟซของไลบรารีมาตรฐาน go
แต่คุณไม่จำเป็นต้องทำสิ่งนี้ด้วยตัวเอง! มีห้องสมุดที่ทำงานให้คุณอยู่แล้ว เราขอแนะนำให้คุณใช้ประเภทของไลบรารีนี้: http://gopkg.in/guregu/null.v3/zero
ในการใช้ omitempty กับประเภทเหล่านั้น คุณต้องระบุเป็นตัวชี้ในโครงสร้างของคุณ
ใช้ api2go กับ gin framework
หากคุณต้องการใช้ api2go กับ gin คุณต้องใช้เราเตอร์อื่นที่ไม่ใช่เราเตอร์เริ่มต้น รับอะแดปเตอร์ตามที่ใช้:
|_+_|
ปัจจุบันแท็กที่รองรับ ได้แก่ |_+_|,|_+_| หรือ |_+_|
หลังจากนั้นคุณสามารถบูต api2go ด้วยวิธีต่อไปนี้:
|_+_|โปรดทราบว่าคุณควรแมป api2go ภายใต้เนมสเปซของตัวเอง เพื่อไม่ให้ขัดแย้งกับเส้นทางปกติของคุณ
หากคุณต้องการ api2go กับ go framework อื่นๆ เพียงส่ง PR พร้อมอแดปเตอร์ตามนั้น :-)
สร้าง REST API
ขั้นแรก เขียนการดำเนินการของ |_+_|, |_+_|, |_+_|, |_+_| หรือทั้งสองอย่างรวมกัน คุณยังสามารถเขียนการนำไปใช้ |_+_| อินเทอร์เฟซที่ฝังไว้ทั้งหมด คุณต้องใช้อย่างน้อยหนึ่งใน 4 วิธีเหล่านี้:
|_+_|หากคุณต้องการส่งคืนข้อผิดพลาดที่เข้ากันได้กับ jsonapi เนื่องจากมีข้อผิดพลาดในเมธอด CRUD คุณสามารถใช้ |_+_| struct ซึ่งสามารถสร้างได้ด้วย |_+_| ซึ่งช่วยให้คุณตั้งรหัสสถานะข้อผิดพลาดและเพิ่มข้อมูลเกี่ยวกับข้อผิดพลาดได้มากเท่าที่คุณต้องการ ดู: ข้อผิดพลาด jsonapi
ในการดึงออบเจกต์ทั้งหมดของทรัพยากรหนึ่งๆ คุณสามารถเลือกที่จะใช้หนึ่งหรือทั้งสองอินเทอร์เฟซต่อไปนี้:
|_+_||_+_| คืนทุกอย่าง คุณสามารถจำกัดผลลัพธ์ได้โดยใช้ Query Params ซึ่งอธิบายไว้เท่านั้น ที่นี่
|_+_| สามารถใช้ Query Params ได้ด้วย แต่นอกเหนือจากนั้น ไม่จำเป็นต้องส่งอ็อบเจกต์ทั้งหมดพร้อมกัน และสามารถแยกผลลัพธ์ด้วยเลขหน้าได้ คุณต้องส่งคืนจำนวนออบเจกต์ที่พบทั้งหมดเพื่อให้ API ของเราสร้างลิงก์การแบ่งหน้าโดยอัตโนมัติ มีการอธิบายเพิ่มเติมเกี่ยวกับการแบ่งหน้า ที่นี่
จากนั้นคุณสามารถสร้าง API:
|_+_|แทนที่จะเป็น |_+_| คุณยังสามารถใช้ |_+_| เพื่อนำหน้าเส้นทางที่สร้างขึ้นโดยอัตโนมัติทั้งหมดด้วยโดเมนและโปรโตคอลของคุณ
สิ่งนี้สร้างจุดสิ้นสุดมาตรฐาน:
|_+_|สำหรับสองเส้นทางที่สร้างขึ้นล่าสุด จำเป็นต้องดำเนินการ |_+_| อินเตอร์เฟซ.
|_+_|เส้นทาง PATCH, POST และ DELETE ทั้งหมดทำ |_+_| และอัปเดตค่า/ความสัมพันธ์ในโครงสร้างที่พบก่อนหน้านี้ โครงสร้างนี้จะถูกส่งต่อไปยัง |_+_| วิธีการของโครงสร้างทรัพยากร ดังนั้นคุณจะได้รับเส้นทางทั้งหมดเหล่านี้ 'ฟรี' และต้องดำเนินการ |_+_| |_+_| กระบวนการ.
พารามิเตอร์แบบสอบถาม
เพื่อรองรับคุณสมบัติทั้งหมดที่กล่าวถึงใน |_+_| ส่วนของ Jsonapi: http://jsonapi.org/format/#fetching
หากคุณต้องการสนับสนุนพารามิเตอร์ใดๆ ที่กล่าวถึงในที่นี้ คุณสามารถเข้าถึงพารามิเตอร์เหล่านั้นได้ในทรัพยากรของคุณผ่านทาง |_+_| พารามิเตอร์. ขณะนี้รองรับ |_+_| ซึ่งเก็บพารามิเตอร์การค้นหาทั้งหมดเป็น |_+_| ไม่ผ่านการกรอง เพื่อให้คุณสามารถใช้สำหรับ:
- การกรอง
- การรวมทรัพยากรที่เชื่อมโยง
- ชุดเขตข้อมูลกระจัดกระจาย
- การเรียงลำดับ
- สิ่งอื่นที่คุณต้องการทำนั้นไม่ได้อยู่ใน Jsonapi Spec อย่างเป็นทางการ
หากมีหลายค่า คุณต้องคั่นด้วยเครื่องหมายจุลภาค api2go จะแบ่งค่าให้คุณโดยอัตโนมัติ
|_+_|การใช้เลขหน้า
Api2go สามารถสร้างลิงก์ที่จำเป็นสำหรับการแบ่งหน้าได้โดยอัตโนมัติ ขณะนี้มี 2 ชุดค่าผสมของพารามิเตอร์การค้นหาที่รองรับ:
- หน้า[จำนวน], หน้า[ขนาด]
- หน้า[ออฟเซ็ต], หน้า[จำกัด]
การแบ่งหน้าเป็นทางเลือก หากคุณต้องการสนับสนุนการแบ่งหน้า คุณต้องใช้ |_+_| วิธีการในโครงสร้างทรัพยากรของคุณ ตัวอย่างเช่น คุณควรพิจารณาโครงการตัวอย่างของเราให้ดีที่สุด
ตัวอย่างคำขอ
|_+_|จะส่งคืน json พร้อมวัตถุลิงก์ระดับบนสุด
|_+_|กำลังดึง ID ที่เกี่ยวข้อง
สามารถดึง ID ของความสัมพันธ์ได้โดยทำตาม |_+_| ลิงก์ของวัตถุความสัมพันธ์ใน |_+_| วัตถุของผลลัพธ์ สำหรับตัวอย่างโพสต์และความคิดเห็น คุณสามารถใช้ URL ที่สร้างขึ้นต่อไปนี้:
|_+_|สิ่งนี้จะส่งคืนความคิดเห็นทั้งหมดที่ถูกอ้างอิงโดยโพสต์ด้วย ID 1 ตัวอย่างเช่น:
|_+_|กำลังเรียกทรัพยากรที่เกี่ยวข้อง
Api2go สร้าง |_+_| เสมอ ช่องสำหรับองค์ประกอบใน |_+_| เป้าหมายของผลลัพธ์ นี่เหมือนกับที่ระบุไว้ใน jsonapi.org ตัวอย่างโพสต์:
|_+_|หากลูกค้าร้องขอสิ่งนี้ |_+_| URL, |_+_| เมธอดของทรัพยากรความคิดเห็นจะถูกเรียกด้วยพารามิเตอร์ข้อความค้นหา |_+_|
ดังนั้น หากคุณใช้ |_+_| วิธีการ อย่าลืมตรวจสอบพารามิเตอร์แบบสอบถามที่เป็นไปได้ทั้งหมด ซึ่งหมายความว่าคุณต้องตรวจสอบโครงสร้างอื่นๆ ของคุณทั้งหมด และหากอ้างอิงถึงโครงสร้างที่คุณกำลังใช้งานอยู่ |_+_| ให้ตรวจสอบ Paramter ของแบบสอบถามและส่งคืนความคิดเห็นที่เป็นของโครงสร้างนั้นเท่านั้น ในตัวอย่างนี้ ส่งคืนความคิดเห็นสำหรับโพสต์
การใช้มิดเดิลแวร์
เรามี |_+_| แบบกำหนดเอง ด้วยการปรับใช้ตามบริบทที่คุณสามารถใช้ได้ เช่น ถ้าคุณต้องการตรวจสอบว่าผู้ใช้ได้รับการรับรองความถูกต้องอย่างถูกต้องหรือไม่ก่อนที่คำขอจะไปถึงเส้นทาง api2go
slack เวอร์ชันฟรี
คุณสามารถใช้โครงสร้างของเราหรือใช้โครงสร้างของคุณเองกับ |_+_| อินเตอร์เฟซ
|_+_|หากคุณใช้ |_+_| ของคุณเอง อย่าลืมกำหนด |_+_| และตั้งค่าด้วย |_+_|
แต่ในกรณีส่วนใหญ่ไม่จำเป็น
หากต้องการใช้มิดเดิลแวร์ จำเป็นต้องใช้ |_+_| ของเรา เอ |_+_| จากนั้นสามารถลงทะเบียนกับ |_+_| คุณสามารถส่งมิดเดิลแวร์หนึ่งหรือหลายตัวที่จะถูกดำเนินการตามลำดับก่อนเส้นทาง api2go อื่น ๆ ใช้สิ่งนี้เพื่อตั้งค่าการเชื่อมต่อฐานข้อมูล การพิสูจน์ตัวตนผู้ใช้ และอื่นๆ
การจัดการ URL แบบไดนามิก
หากคุณมี TLD ที่แตกต่างกันสำหรับ API เดียว หรือต้องการใช้โดเมนอื่นในการพัฒนาและใช้งานจริง คุณสามารถใช้ URLResolver ที่กำหนดเองใน api2go ได้
มีอินเทอร์เฟซที่เรียบง่าย ซึ่งสามารถใช้ได้หากคุณได้รับข้อมูล TLD จากฐานข้อมูล สภาพแวดล้อมของเซิร์ฟเวอร์ หรือสิ่งอื่นใดที่ไม่ได้ขึ้นอยู่กับคำขอ:
|_+_|และอันที่ซับซ้อนกว่าซึ่งได้รับข้อมูลคำขอด้วย:
|_+_|สำหรับกรณีการใช้งานส่วนใหญ่ เรามี CallbackResolver ซึ่งทำงานตามคำขอและอาจตอบสนองความต้องการขั้นพื้นฐานของคุณ สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณใช้พร็อกซี nginx ซึ่งตั้งค่า |_+_| ส่วนหัว
|_+_|การทดสอบ
|_+_|ผู้เขียน: Manyminds
ซอร์สโค้ด: https://github.com/manyminds/api2go
ใบอนุญาต: ใบอนุญาต MIT
#เติบโต #api #json
ดูสิ่งนี้ด้วย:
- บทช่วยสอน Laravel 7 สำหรับผู้เริ่มต้น - อัปโหลดรูปภาพสำหรับผู้ใช้
- วิธีการตั้งค่าขั้นสูงสุดสำหรับโครงการ Golang ถัดไปของคุณ
- การหลอกลวงบน Steam ที่ใหญ่ที่สุดเท่าที่เคยมีมา
- ไม่สามารถสร้างแอปด้วย Maven ได้ ฉันสามารถเรียกใช้โค้ดในเครื่องได้ แต่ไม่สามารถปรับใช้บน heroku
- EleutherAI GPT-Neo เวอร์ชันโอเพ่นซอร์สของ GPT-3