Api2go: JSONAPI.org การดำเนินการสำหรับ Go

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา

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

ดูสิ่งนี้ด้วย: