พื้นหลัง
ด้วยแหล่งที่มาของ REACT ทำให้ Facebook ได้เปิดโครงการที่เกี่ยวข้องหลายโครงการอย่างต่อเนื่อง โครงการเหล่านี้ถูกนำมาใช้ในหลายปี สิ่งที่ดึงดูดความสนใจของฉันคือเวลานี้คือ GraphQl ปัจจุบันมีเพียงเวอร์ชัน NodeJS ของเว็บไซต์ทางการ เนื่องจากสแต็คเทคโนโลยีแบ็กเอนด์ของหลาย บริษัท เป็น Java จึงมีการใช้งาน Java Version ของ GraphQL ซึ่งสามารถพบได้ใน GitHub โดยไม่ต้องกังวลใจเพิ่มเติมเพียงแค่ดูรหัส สำหรับการแนะนำเฉพาะให้ไปที่ Cafe เว็บไซต์อย่างเป็นทางการมิฉะนั้นจะปิดหัวข้อ
graphqlschema
สคีมาเทียบเท่ากับฐานข้อมูลประกอบด้วย graphqlfielddefinitions จำนวนมากฟิลด์เทียบเท่ากับตารางฐานข้อมูล/มุมมองและแต่ละตาราง/มุมมองประกอบด้วยชื่อพารามิเตอร์การสืบค้นโครงสร้างข้อมูลและข้อมูล
1) ก่อนกำหนดโครงสร้างข้อมูล (graphqloutputtype) จากนั้นกำหนดวิธีการเริ่มต้น
private graphqloutputtype usertype; โมฆะส่วนตัว itoutputType () { / *** โครงสร้างวัตถุสมาชิก* / userType = newObject () .Name ("ผู้ใช้") .Field (newfieldDefinition () ชื่อ ("ID"). พิมพ์ (graphQlint) .Field (NewfieldDefinition (). ชื่อ ("อายุ"). ประเภท (graphQlint) .build ()) .Field (NewfieldDefinition (). ชื่อ ("ชื่อ"). ประเภท (graphqlstring) .build ())2) กำหนดสองตาราง/มุมมองซึ่งรวมถึงชื่อพารามิเตอร์การสืบค้นโครงสร้างข้อมูลและการดึงข้อมูล
/ *** การสืบค้นข้อมูลผู้ใช้เดี่ยว* @return*/ private graphqlfielddefinition createUserField () {return graphqlfielddefinition.newfielddefinition () .name ("ผู้ใช้"). Argument (newargument (). name ("idepeter. query parameters int id = environment.getArgument("id"); // Execute the query, here you can use some test data to illustrate the problem User user = new User(); user.setId(id); user.setAge(id + 15); user.setSex(id % 2); user.setName("Name_" + id); user.setPic("pic_" + id + ".jpg"); return user; }) .สร้าง(); } / *** Query ข้อมูลสมาชิกหลายข้อมูล* @return* / private graphqlfielddefinition createUsersfield () {return graphqlfielddefinition.newfielddefinition () .name ("ผู้ใช้") .Argument (newargument (). ชื่อ ("ขนาด"). ประเภท (graphqlint) .build ()) .argument (newargument (). ชื่อ ("ชื่อ"). ประเภท (graphqlstring) .build () .Type สิ่งแวดล้อม. getargument ("หน้า"); + 15); -3) จากนั้นกำหนดสคีมาและเริ่มต้นมันมีชื่อและหนึ่งตาราง/มุมมอง (ฟิลด์)
schema private graphqlschema; public graphschema () {initoutputType (); schema = graphqlschema.newschema (). Query (newobject () .name ("GraphQuery") .field (createUsersfield ()) .field (createUserField ()) .build ()). สร้าง (); -4) หลังจากทำตามขั้นตอนข้างต้นเสร็จแล้วคุณต้องกำหนดโมเดลโดยไม่ จำกัด ชื่อคลาส แต่โครงสร้างจำเป็นต้องตรงกับโครงสร้างข้อมูลที่กำหนดไว้ข้างต้นและจะต้องเป็นสาธารณะ
ผู้ใช้ระดับสาธารณะ {ID INT ส่วนตัว; อายุ int ส่วนตัว; เซ็กส์ส่วนตัว ชื่อสตริงส่วนตัว; รูปสตริงส่วนตัว; // getter, setter ... }5) จากนั้นเขียนวิธีหลักเพื่อทดสอบ
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {graphqlschema schema = new graphschema (). getSchema (); String query1 = "{ผู้ใช้ (หน้า: 2, ขนาด: 5, ชื่อ:/" john/") {id, เพศ, ชื่อ, pic}}"; String query2 = "{user (id: 6) {id, sex, ชื่อ, pic}}"; string query3 = "{user (id: 6) {id, เพศ, ชื่อ, pic}, ผู้ใช้ (หน้า: 2, ขนาด: 5, ชื่อ:/" john/") {id, เพศ, ชื่อ, pic}}"; แผนที่ <string, Object> result1 = (แผนที่ <string, object>) graphQl ใหม่ (schema) .Execute (query1) .getData (); แผนที่ <string, object> result2 = (แผนที่ <string, object>) graphql ใหม่ (schema) .Execute (query2) .getData (); แผนที่ <string, object> result3 = (แผนที่ <string, object>) graphql ใหม่ (schema) .Execute (query3) .getData (); // สอบถามรายชื่อผู้ใช้ System.out.println (ผลลัพธ์ที่ 1); // สอบถามระบบผู้ใช้เดียว OUT.PRINTLN (ผลลัพธ์ 2); // ตรวจสอบ System.out.println (ผลลัพธ์ 3);}เอาท์พุท:
{users = [{id = 0, sex = 0, name = john_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, ชื่อ = john_2_1, pic = pic_1.jpg}, {id = 2, sex = 0, name = john_2_2, pic = pic_2.jpg} pic = pic_3.jpg}, {id = 4, sex = 0, name = john_2_4, pic = pic_4.jpg}]} {user = {id = 6, sex = 0, name = name_6, pic = pic_6.jpg}} {user = {id = 6, sex = 0 sex = 0, name = john_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, name = john_2_1, pic = pic_1.jpg}, {id = 2, sex = 0, name = john_2_2, pic = pic_2.jpg} {id = 4, sex = 0, name = john_2_4, pic = pic_4.jpg}]}6) ในที่สุดใส่รหัสในวิธีการหลักบนเว็บเลเยอร์และจำเป็นต้องกำหนดพารามิเตอร์การสืบค้นเท่านั้นมันเป็นเรื่องง่ายที่จะสร้างบริการคิวรี อินเทอร์เฟซแบบสอบถามดั้งเดิมยังคงเรียกอยู่ใน DataFetcher
7) แนะนำการพึ่งพา Maven
<Ederency> <roupId> com.graphql-java </groupId> <ratifactId> graphql-java </artifactid> <version> 2.0.0 </version> </derness>
เกี่ยวกับคำจำกัดความของการสืบค้น GraphQL ดูสิ่งนี้อาจเป็นประโยชน์กับคุณ
JSON
{id = 6, sex = 0, name = "name_6", pic = "pic_6.jpg"}สอบถาม
{id, เพศ, ชื่อ, pic}ส่วนหลังเป็นสตริง JSON ผลลัพธ์ของการลบ = และค่ายังคงสามารถอ่านได้
บทสรุป
GraphQL นำวิธีการคิดใหม่ซึ่งสามารถทำให้การพัฒนาของเว็บ API ง่ายขึ้น ไคลเอนต์ระบุว่าข้อมูลที่ต้องการและข้อมูลใดที่ส่งคืนโดยเซิร์ฟเวอร์ลดการส่งสัญญาณการรับส่งข้อมูลที่ไม่จำเป็นเป็นมิตรกับเทอร์มินัลมือถือและยังมีการค้นหาข้อมูลการรวมข้อมูลที่หลากหลาย การสืบค้นหลายครั้งใช้เพียงคำขอเดียวซึ่งไม่เพียง แต่ตรงกับความละเอียดขั้นต่ำของ API แต่ยังตรงกับความต้องการของส่วนหน้าลดคำขอและปรับปรุงประสิทธิภาพ
ฉันรู้สึกว่าฉันจะพัฒนาในทิศทางนี้ในอนาคตโดยได้รับแรงหนุนจากแนวโน้มทั่วไป