GraphQL - ไคลเอนต์ Apollo
เราได้ใช้ Apollo Server เพื่อสร้างข้อกำหนด graphql บนฝั่งเซิร์ฟเวอร์ มันง่ายและรวดเร็วในการสร้างเซิร์ฟเวอร์ GraphQL ที่พร้อมใช้งานจริง ตอนนี้ให้เราเข้าใจฝั่งไคลเอ็นต์
Apollo Client เป็นวิธีที่ดีที่สุดในการใช้ GraphQL เพื่อสร้างแอปพลิเคชันไคลเอนต์ ไคลเอนต์ได้รับการออกแบบมาเพื่อช่วยให้นักพัฒนาสร้าง UI ที่ดึงข้อมูลด้วย GraphQL ได้อย่างรวดเร็วและสามารถใช้กับส่วนหน้าของ JavaScript ใดก็ได้
Apollo Client รองรับแพลตฟอร์มต่อไปนี้ -
ซีเนียร์ | แพลตฟอร์มและกรอบงาน |
---|---|
1 | Javascript ปฏิกิริยาเชิงมุม, Vue, ดาวตก, Ember |
2 | WebComponents พอลิเมอร์ไลท์อพอลโล |
3 | Native Mobile Native Android พร้อม Java, Native iOS พร้อม Swift |
การแคชเป็นหนึ่งในคุณสมบัติหลักของ Apollo Client apollo-boost เป็นแพ็คเกจอำนวยความสะดวกที่นำมาซึ่งการพึ่งพาอื่น ๆ อีกมากมาย
ภาพประกอบ
ให้เราดูวิธีใช้ Apollo Client เพื่อสร้างแอปพลิเคชันไคลเอนต์โดยใช้ขั้นตอนต่อไปนี้ -
การตั้งค่าเซิร์ฟเวอร์
เราต้องทำตามขั้นตอนด้านล่างเพื่อตั้งค่าเซิร์ฟเวอร์ -
ขั้นตอนที่ 1 - ดาวน์โหลดและติดตั้งการอ้างอิงที่จำเป็นสำหรับโครงการ
สร้างโฟลเดอร์ apollo-server-app เปลี่ยนไดเร็กทอรีของคุณเป็น apollo-server-app จากขั้ว จากนั้นทำตามขั้นตอนที่ 3 ถึง 5 ที่อธิบายไว้ในบทการตั้งค่าสภาพแวดล้อม
ขั้นตอนที่ 2 - สร้างสคีมา
เพิ่ม schema.graphql ไฟล์ในโฟลเดอร์โครงการ apollo-server-app และเพิ่มรหัสต่อไปนี้ -
type Query
{
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
college:College
}
type College {
id:ID!
name:String
location:String
rating:Float
}
ขั้นตอนที่ 3 - เพิ่มตัวแก้ไข
สร้างไฟล์ resolvers.js ในโฟลเดอร์โครงการและเพิ่มรหัสต่อไปนี้ -
const db = require('./db')
const Query = {
//resolver function for students returns list
students:() => db.students.list(),
}
const Student = {
college:(root) => {
return db.colleges.get(root.collegeId);
}
}
module.exports = {Query,Student}
ขั้นตอนที่ 4 - เรียกใช้แอปพลิเคชัน
สร้างไฟล์ server.jsไฟล์. อ้างถึงขั้นตอนที่ 8 ในบทการตั้งค่าสภาพแวดล้อม ดำเนินการคำสั่ง npm start ในเทอร์มินัล เซิร์ฟเวอร์จะทำงานบนพอร์ต 9000 ในที่นี้เราจะใช้ GraphiQL เป็นไคลเอนต์เพื่อทดสอบแอปพลิเคชัน
เปิดเบราว์เซอร์และพิมพ์ URL http://localhost:9000/graphiql. พิมพ์แบบสอบถามต่อไปนี้ในตัวแก้ไข
{
students{
id
firstName
college{
name
}
}
}
การตอบสนองสำหรับแบบสอบถามมีดังต่อไปนี้ -
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim",
"college": {
"name": "CUSAT"
}
},
{
"id": "S1002",
"firstName": "Kannan",
"college": {
"name": "AMU"
}
},
{
"id": "S1003",
"firstName": "Kiran",
"college": {
"name": "AMU"
}
}
]
}
}
การตั้งค่าไคลเอนต์
เปิดเทอร์มินัลใหม่สำหรับไคลเอนต์ ควรให้เทอร์มินัลเซิร์ฟเวอร์ทำงานต่อไปก่อนที่จะเรียกใช้แอปพลิเคชันไคลเอนต์ แอปพลิเคชัน React จะทำงานบนพอร์ตหมายเลข 3000 และแอปพลิเคชันเซิร์ฟเวอร์บนพอร์ตหมายเลข 9000
ขั้นตอนที่ 1 - สร้างแอปพลิเคชันตอบสนอง
ในไคลเอนต์เทอร์มินัลพิมพ์คำสั่งต่อไปนี้ -
npx create-react-app hello-world-client
สิ่งนี้จะติดตั้งทุกสิ่งที่จำเป็นสำหรับแอปพลิเคชันการตอบสนองทั่วไป ยูทิลิตี้ npx และเครื่องมือสร้างปฏิกิริยาแอปสร้างโปรเจ็กต์ที่มีชื่อhello-world-client. เมื่อการติดตั้งเสร็จสิ้นให้เปิดโครงการใน VSCode
ขั้นตอนที่ 2 - เริ่มสวัสดีลูกค้าทั่วโลก
เปลี่ยนเส้นทางโฟลเดอร์ปัจจุบันในเทอร์มินัลเป็น hello-world-client. พิมพ์ npm start เพื่อเปิดตัวโปรเจ็กต์ การดำเนินการนี้จะเรียกใช้เซิร์ฟเวอร์การพัฒนาที่พอร์ต 3000 และจะเปิดเบราว์เซอร์โดยอัตโนมัติและโหลดหน้าดัชนี
สิ่งนี้แสดงในภาพหน้าจอด้านล่าง -
ขั้นตอนที่ 3 - ติดตั้ง Apollo Client Libraries
ในการติดตั้ง Apollo Client ให้เปิดเทอร์มินัลใหม่และอยู่ในเส้นทางโฟลเดอร์โครงการปัจจุบัน พิมพ์คำสั่งต่อไปนี้ -
npm install apollo-boost graphql
สิ่งนี้จะดาวน์โหลดไลบรารี graphql สำหรับฝั่งไคลเอ็นต์และแพ็คเกจ Apollo Boost เราสามารถตรวจสอบสิ่งนี้ได้โดยพิมพ์ npm view ใน apollo-boost dependencies สิ่งนี้จะมีการอ้างอิงมากมายดังที่แสดงด้านล่าง -
{
'apollo-cache': '^1.1.15',
'apollo-cache-inmemory': '^1.2.8',
'apollo-client': '^2.4.0',
'apollo-link': '^1.0.6',
'apollo-link-error': '^1.0.3',
'apollo-link-http': '^1.3.1',
'apollo-link-state': '^0.4.0',
'graphql-tag': '^2.4.2'
}
เราจะเห็นได้ชัดเจนว่ามีการติดตั้งไลบรารี Apollo-Client
ขั้นตอนที่ 4 - แก้ไขส่วนประกอบของแอพในไฟล์ index.js
ด้วย Apollo Client เราสามารถเรียกเซิร์ฟเวอร์ได้โดยตรงโดยไม่ต้องใช้ fetch API นอกจากนี้ไม่ควรฝังข้อความค้นหาและการกลายพันธุ์ไว้ในสตริงที่สร้างด้วยเครื่องหมายขีดหลัง นี่เป็นเพราะไฟล์gqlฟังก์ชันแยกวิเคราะห์แบบสอบถามโดยตรง ซึ่งหมายความว่าโปรแกรมเมอร์สามารถเขียนแบบสอบถามได้โดยตรงในลักษณะเดียวกันเมื่อเขียนแบบสอบถามในเครื่องมือ GraphiQL gql เป็นฟังก์ชันแท็กซึ่งจะแยกวิเคราะห์สตริงแม่แบบที่เขียนด้วยเครื่องหมายขีดหลังไปยังวัตถุแบบสอบถาม graphql วิธีการสอบถาม Apollo Client ส่งคืนคำสัญญา
ข้อมูลโค้ดต่อไปนี้แสดงวิธีการนำเข้า Apollo Client -
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
const endPointUrl = 'http://localhost:9000/graphql'
const client = new ApolloClient({
link: new HttpLink({uri:endPointUrl}),
cache:new InMemoryCache()
});
ในบทที่แล้วเราได้พูดถึงวิธีใช้ fetch API สำหรับคำขอ HTTP รหัสต่อไปนี้แสดงวิธีใช้gqlฟังก์ชัน loadStudentsAsync ฟังก์ชันใช้ไคลเอนต์ graphql เพื่อค้นหาเซิร์ฟเวอร์
async function loadStudentsAsync() {
const query = gql`
{
students{
id
firstName
lastName
college{
name
}
}
}`
const {data} = await client.query({query}) ;
return data.students;
}
คุณจะต้องเก็บไฟล์ index.js ใน srcโฟลเดอร์และ index.html ในโฟลเดอร์สาธารณะ ไฟล์อื่น ๆ ทั้งหมดที่สร้างขึ้นโดยอัตโนมัติสามารถลบออกได้
โครงสร้างไดเร็กทอรีได้รับด้านล่าง -
hello-world-client /
-->node_modules
-->public
index.html
-->src
index.js
-->package.json
ต่อไปนี้คือไฟล์ index.js ในแอปพลิเคชันตอบสนอง -
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
// apollo client
import {ApolloClient, HttpLink, InMemoryCache} from 'apollo-boost'
import gql from 'graphql-tag'
const endPointUrl = 'http://localhost:9000/graphql'
const client = new ApolloClient({
link: new HttpLink({uri:endPointUrl}),
cache:new InMemoryCache()
});
async function loadStudentsAsync() {
const query = gql`
{
students{
id
firstName
lastName
college{
name
}
}
}
`
const {data} = await client.query({query}) ;
return data.students;
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
students:[]
}
this.studentTemplate = [];
}
async loadStudents() {
const studentData = await loadStudentsAsync();
this.setState({
students: studentData
})
console.log("loadStudents")
}
render() {
return(
<div>
<input type = "button" value = "loadStudents" onClick = {this.loadStudents.bind(this)}/>
<div>
<br/>
<hr/>
<table border = "3">
<thead>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>college Name</td>
</tr>
</thead>
<tbody>
{
this.state.students.map(s => {
return (
<tr key = {s.id}>
<td>
{s.firstName}
</td>
<td>
{s.lastName}
</td>
<td>
{s.college.name}
</td>
</tr>
)
})
}
</tbody>
</table>
</div>
</div>
)
}
}
ReactDOM.render(<App/>, document.getElementById('root'));
แอปพลิเคชันตอบกลับจะโหลดนักเรียนจากเซิร์ฟเวอร์ GraphQL เมื่อเราคลิกที่ปุ่ม loadStudents ดังที่แสดงด้านล่าง -