วิธีประหยัดอินเทอร์เน็ต | 
    |
|---|---|
| PUT | เขียนหรือแทนที่ข้อมูลไปยังเส้นทางที่กำหนด เช่น fireblog/users/user1/<data> | 
    
| PATCH | อัปเดตคีย์บางรายการสำหรับเส้นทางที่กำหนดโดยไม่ต้องแทนที่ข้อมูลทั้งหมด | 
| POST | เพิ่มลงในรายการข้อมูลในฐานข้อมูล Firebase ทุกครั้งที่เราส่งPOSTคำขอ ไคลเอ็นต์ Firebase จะสร้างคีย์ที่ไม่ซ้ำกัน เช่น fireblog/users/<unique-id>/<data> | 
    
| ลบ | นำข้อมูลออกจากการอ้างอิงฐานข้อมูล Firebase ที่ระบุ | 
การเขียนข้อมูลด้วย PUT
    การดำเนินการเขียนพื้นฐานผ่าน REST API คือ PUT หากต้องการ
    แสดงให้เห็นถึงการบันทึกข้อมูล เราจะสร้างแอปพลิเคชันบล็อกที่มีโพสต์และผู้ใช้ ข้อมูลทั้งหมดของแอปพลิเคชันจะจัดเก็บไว้ในเส้นทางของ `fireblog` ที่ URL ฐานข้อมูล Firebase `https://docs-examples.firebaseio.com/fireblog`
  
    มาเริ่มกันด้วยการบันทึกข้อมูลผู้ใช้บางส่วนลงในฐานข้อมูล Firebase เราจะจัดเก็บผู้ใช้แต่ละรายตามชื่อผู้ใช้ที่ไม่ซ้ำกัน
    และจะจัดเก็บชื่อเต็มและวันเกิดของผู้ใช้ด้วย เนื่องจากผู้ใช้แต่ละรายจะมีชื่อผู้ใช้ที่ไม่ซ้ำกัน จึงควรใช้ PUT แทน POST เนื่องจากเรามีคีย์อยู่แล้วและไม่จำเป็นต้องสร้างคีย์ใหม่
  
    การใช้ PUT ช่วยให้เราเขียนสตริง ตัวเลข บูลีน อาร์เรย์ หรือออบเจ็กต์ JSON ใดก็ได้ลงใน
    ฐานข้อมูล Firebase ในกรณีนี้ เราจะส่งออบเจ็กต์ให้
  
curl -X PUT -d '{
  "alanisawesome": {
    "name": "Alan Turing",
    "birthday": "June 23, 1912"
  }
}' 'https://docs-examples.firebaseio.com/fireblog/users.json'
เมื่อบันทึกออบเจ็กต์ JSON ลงในฐานข้อมูล ระบบจะ แมปพร็อพเพอร์ตี้ของออบเจ็กต์กับสถานที่ตั้งย่อยโดยอัตโนมัติในลักษณะที่ซ้อนกัน หากเราไปยังโหนดที่สร้างขึ้นใหม่ เราจะเห็นค่า "Alan Turing" นอกจากนี้ เรายัง บันทึกข้อมูลลงใน ตำแหน่งย่อยได้โดยตรงด้วย
curl -X PUT -d '"Alan Turing"' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/name.json'
curl -X PUT -d '"June 23, 1912"' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/birthday.json'
ตัวอย่าง 2 รายการข้างต้น ได้แก่ การเขียนค่าพร้อมกับออบเจ็กต์และการเขียนค่าแยกกันไปยังตำแหน่งย่อย จะส่งผลให้ระบบบันทึกข้อมูลเดียวกันลงในฐานข้อมูล Firebase ของเรา
{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing"
    }
  }
}
    คำขอที่สำเร็จจะระบุด้วย200 OKรหัสสถานะ HTTP และการตอบกลับจะมีข้อมูลที่เราเขียนลงในฐานข้อมูล ตัวอย่างแรกจะทริกเกอร์เหตุการณ์เดียวในไคลเอ็นต์ที่ดูข้อมูล ในขณะที่ตัวอย่างที่สองจะทริกเกอร์ 2 เหตุการณ์ โปรดทราบว่าหากมีข้อมูลอยู่ในเส้นทางของผู้ใช้อยู่แล้ว วิธีแรกจะเขียนทับข้อมูลนั้น แต่ในขณะที่วิธีที่ 2 จะแก้ไขเฉพาะค่าของแต่ละโหนดลูกที่แยกกันโดยไม่เปลี่ยนแปลงโหนดลูกอื่นๆ PUT มีค่าเท่ากับ
    set() ใน JavaScript SDK
  
การอัปเดตข้อมูลด้วย PATCH
    การใช้PATCHคำขอจะช่วยให้เราอัปเดตเด็กที่เฉพาะเจาะจงในสถานที่หนึ่งๆ ได้โดยไม่ต้อง
    เขียนทับข้อมูลที่มีอยู่ มาเพิ่มชื่อเล่นของทัวริงลงในข้อมูลผู้ใช้ด้วยPATCH
    คำขอ
  
curl -X PATCH -d '{
  "nickname": "Alan The Machine"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'
    คำขอข้างต้นจะเขียน nickname ไปยังออบเจ็กต์ alanisawesome
    โดยไม่ลบออบเจ็กต์ย่อย name หรือ birthday โปรดทราบว่าหากเราได้
    ส่งPUTคำขอที่นี่แทนname birthday
    ระบบจะลบเนื้อหาดังกล่าวเนื่องจากไม่ได้รวมอยู่ในคำขอ ตอนนี้ข้อมูลในฐานข้อมูล Firebase
    มีลักษณะดังนี้
  
{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing",
      "nickname": "Alan The Machine"
    }
  }
}
    คำขอที่สำเร็จจะระบุด้วย200 OKรหัสสถานะ HTTP และการตอบกลับจะมีข้อมูลที่อัปเดตซึ่งเขียนลงในฐานข้อมูล
  
        นอกจากนี้ Firebase ยังรองรับการอัปเดตหลายเส้นทางด้วย ซึ่งหมายความว่าตอนนี้ PATCH สามารถอัปเดตค่าในหลายตำแหน่งในฐานข้อมูล Firebase ได้พร้อมกัน ซึ่งเป็นฟีเจอร์ที่มีประสิทธิภาพที่ช่วยให้คุณ
        ยกเลิกการทำให้ข้อมูลเป็นมาตรฐาน การใช้การอัปเดตแบบหลายเส้นทางช่วยให้เราเพิ่มชื่อเล่นให้กับทั้ง Alan และ Grace ได้พร้อมกัน
    
curl -X PATCH -d '{
  "alanisawesome/nickname": "Alan The Machine",
  "gracehopper/nickname": "Amazing Grace"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'
หลังจากอัปเดตนี้ เราได้เพิ่มชื่อเล่นของทั้ง Alan และ Grace ดังนี้
{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing",
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "date_of_birth": "December 9, 1906",
      "full_name": "Grace Hopper",
      "nickname": "Amazing Grace"
    }
  }
}โปรดทราบว่าการพยายามอัปเดตออบเจ็กต์โดยการเขียนออบเจ็กต์ที่มีเส้นทางรวมอยู่ด้วยจะทำให้เกิดลักษณะการทำงานที่แตกต่างกัน มาดูกันว่าจะเกิดอะไรขึ้นหากเราพยายามอัปเดต Grace และ Alan ด้วยวิธีนี้แทน
curl -X PATCH -d '{
  "alanisawesome": {"nickname": "Alan The Machine"},
  "gracehopper": {"nickname": "Amazing Grace"}
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'
      ซึ่งจะส่งผลให้เกิดลักษณะการทำงานที่แตกต่างกัน กล่าวคือ การเขียนทับทั้งโหนด /fireblog/users
    
{
  "users": {
    "alanisawesome": {
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "nickname": "Amazing Grace"
    }
  }
}การอัปเดตข้อมูลด้วยคำขอแบบมีเงื่อนไข
คุณใช้คำขอแบบมีเงื่อนไข ซึ่งเทียบเท่ากับธุรกรรมใน REST เพื่ออัปเดต ข้อมูลตามสถานะที่มีอยู่ได้ ตัวอย่างเช่น หากต้องการเพิ่มตัวนับการโหวตเห็นด้วย และต้องการให้แน่ใจว่าจำนวนจะแสดงการโหวตเห็นด้วยหลายรายการพร้อมกันอย่างถูกต้อง ให้ใช้คำขอแบบมีเงื่อนไขเพื่อเขียนค่าใหม่ลงในตัวนับ แทนที่จะเขียน 2 ครั้ง เพื่อเปลี่ยนตัวนับเป็นหมายเลขเดียวกัน คำขอเขียนรายการใดรายการหนึ่งจะล้มเหลว จากนั้นคุณจะลองส่งคำขออีกครั้งด้วยค่าใหม่ได้- หากต้องการส่งคำขอแบบมีเงื่อนไขที่ตำแหน่ง ให้รับตัวระบุที่ไม่ซ้ำ
    สำหรับข้อมูลปัจจุบันที่ตำแหน่งนั้น หรือ ETag หากข้อมูลมีการเปลี่ยนแปลงที่
    ตำแหน่งนั้น ETag ก็จะเปลี่ยนแปลงด้วย คุณขอ ETag ด้วยเมธอดใดก็ได้
    ยกเว้น 
PATCHตัวอย่างต่อไปนี้ใช้คำขอGET การเรียก ETag ในส่วนหัวจะแสดง ETag ของ ตำแหน่งที่ระบุในการตอบกลับ HTTPcurl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
HTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 10 // Current value of the data at the specified location
 - รวม ETag ที่ส่งคืนไว้ในคำขอ 
PUTหรือDELETEครั้งถัดไปเพื่ออัปเดต ข้อมูลที่ตรงกับค่า ETag นั้นๆ โดยเฉพาะ จากตัวอย่างของเรา หากต้องการอัปเดตตัวนับเป็น 11 หรือ 1 มากกว่าค่าที่ดึงมาเริ่มต้นที่ 10 และทำให้คำขอไม่สำเร็จหากค่าไม่ตรงกันอีกต่อไป ให้ใช้โค้ดต่อไปนี้ หากค่าของข้อมูลในตำแหน่งที่ระบุยังคงเป็น 10 ETag ในคำขอcurl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
PUTจะตรงกันและคำขอจะสำเร็จ โดยเขียน 11 ลงในฐานข้อมูล หากตำแหน่งไม่ตรงกับ ETag อีกต่อไป ซึ่งอาจเกิดขึ้นหากผู้ใช้รายอื่น เขียนค่าใหม่ลงในฐานข้อมูล คำขอจะล้มเหลวโดยไม่มีการเขียนไปยัง ตำแหน่ง การตอบกลับการคืนสินค้าจะมีค่าใหม่และ ETagHTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * Cache-Control: no-cache 11 // New value of the data at the specified location, written by the conditional request
HTTP/1.1 412 Precondition Failed Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 12 // New value of the data at the specified location
 - ใช้ข้อมูลใหม่หากคุณตัดสินใจที่จะลองส่งคำขออีกครั้ง Realtime Database จะไม่ลองส่งคำขอแบบมีเงื่อนไขที่ไม่สำเร็จอีกครั้งโดยอัตโนมัติ อย่างไรก็ตาม คุณสามารถใช้ค่าใหม่และ ETag เพื่อสร้างคำขอแบบมีเงื่อนไขใหม่ด้วย ข้อมูลที่การตอบกลับที่ล้มเหลวแสดง
 
คำขอแบบมีเงื่อนไขที่อิงตาม REST จะใช้มาตรฐาน HTTP if-match แต่จะแตกต่างจากมาตรฐานในลักษณะต่อไปนี้
- คุณระบุค่า ETag ได้เพียงค่าเดียวสำหรับคำขอ if-match แต่ละรายการ ไม่ใช่หลายค่า
 -  แม้ว่ามาตรฐานจะแนะนำให้ส่งคืน ETag พร้อมกับคำขอทั้งหมด
     แต่ Realtime Database จะส่งคืน ETag พร้อมกับคำขอที่มีส่วนหัว
X-Firebase-ETagเท่านั้น ซึ่งจะช่วยลดต้นทุนการเรียกเก็บเงินสำหรับคำขอมาตรฐาน 
คำขอแบบมีเงื่อนไขอาจช้ากว่าคำขอ REST ทั่วไปด้วย
การบันทึกรายการข้อมูล
    หากต้องการสร้างคีย์ที่ไม่ซ้ำกันตามการประทับเวลาสำหรับทุกรายการที่เพิ่มลงในการอ้างอิงฐานข้อมูล Firebase
    เราสามารถส่งคำขอ POST ได้ สำหรับusersเส้นทางของเรา การกำหนดคีย์ของเราเองนั้นสมเหตุสมผล
    เนื่องจากผู้ใช้แต่ละรายมีชื่อผู้ใช้ที่ไม่ซ้ำกัน แต่เมื่อผู้ใช้เพิ่มบล็อกโพสต์ลงในแอป เราจะใช้คำขอ POST เพื่อสร้างคีย์สำหรับบล็อกโพสต์แต่ละรายการโดยอัตโนมัติ
  
curl -X POST -d '{
  "author": "alanisawesome",
  "title": "The Turing Machine"
}' 'https://docs-examples.firebaseio.com/fireblog/posts.json'
    posts เส้นทางของเรามีข้อมูลต่อไปนี้
  
{
  "posts": {
    "-JSOpn9ZC54A4P4RoqVa": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}
    โปรดสังเกตว่าระบบสร้างคีย์ -JSOpn9ZC54A4P4RoqVa ให้เราโดยอัตโนมัติเนื่องจาก
    เราใช้คำขอ POST คำขอที่สำเร็จจะระบุด้วยรหัสสถานะ HTTP 200 OK
    และการตอบกลับจะมีคีย์ของข้อมูลใหม่ที่เพิ่ม
  
{"name":"-JSOpn9ZC54A4P4RoqVa"}การนำข้อมูลออก
    หากต้องการนำข้อมูลออกจากฐานข้อมูล เราสามารถส่งDELETEคำขอพร้อม URL ของเส้นทางที่เราต้องการลบข้อมูล คำสั่งต่อไปนี้จะลบ Alan ออกจาก
    usersเส้นทาง
  
curl -X DELETE \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'
     คำขอ DELETE ที่สำเร็จจะระบุด้วย200 OKรหัสสถานะ HTTP พร้อมการตอบกลับที่มี JSON null
  
พารามิเตอร์ URI
REST API ยอมรับพารามิเตอร์ URI ต่อไปนี้เมื่อเขียนข้อมูลลงในฐานข้อมูล
การตรวจสอบสิทธิ์
    auth พารามิเตอร์คำขอช่วยให้เข้าถึงข้อมูลที่ได้รับการคุ้มครองโดย
    Firebase Realtime Database Security Rules และ
    รองรับคำขอทุกประเภท อาร์กิวเมนต์อาจเป็นข้อมูลลับของแอป Firebase หรือโทเค็นการตรวจสอบสิทธิ์ ซึ่งเราจะกล่าวถึงในส่วนการให้สิทธิ์ผู้ใช้ ในตัวอย่างต่อไปนี้ เราจะส่งPOSTคำขอที่มีพารามิเตอร์
    auth โดยที่ CREDENTIAL คือข้อมูลลับของแอป Firebase หรือ
    โทเค็นการตรวจสอบสิทธิ์
  
curl -X POST -d '{"Authenticated POST request"}' \
  'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
พิมพ์
    พารามิเตอร์ print ช่วยให้เราระบุรูปแบบของการตอบกลับจากฐานข้อมูลได้
 การเพิ่ม print=pretty ในคำขอจะแสดงข้อมูลในรูปแบบที่มนุษย์อ่านได้
 print=pretty รองรับคำขอ GET,
    PUT, POST, PATCH และ DELETE
  
    หากต้องการระงับเอาต์พุตจากเซิร์ฟเวอร์เมื่อเขียนข้อมูล เราสามารถเพิ่ม
    print=silent ลงในคำขอ การตอบกลับที่ได้จะว่างเปล่าและระบุโดย
    204 No Contentรหัสสถานะ HTTP หากคำขอสำเร็จ
    print=silent ได้รับการรองรับโดยคำขอ GET, PUT,
    POST และ PATCH
  
การเขียนค่าเซิร์ฟเวอร์
    ค่าเซิร์ฟเวอร์สามารถเขียนได้ที่ตำแหน่งโดยใช้ค่าตัวยึดตำแหน่ง ซึ่งเป็นออบเจ็กต์ที่มีคีย์ ".sv" เดียว ค่าสำหรับคีย์นั้นคือประเภทของค่าเซิร์ฟเวอร์ที่เราต้องการตั้งค่า
    เช่น หากต้องการตั้งค่าการประทับเวลาเมื่อสร้างผู้ใช้ เราสามารถทำได้ดังนี้
  
curl -X PUT -d '{".sv": "timestamp"}' \
  'https://docs-examples.firebaseio.com/alanisawesome/createdAt.json'
    "timestamp" เป็นค่าเซิร์ฟเวอร์เดียวที่รองรับ และเป็นเวลาตั้งแต่ Epoch ของ UNIX
    ในหน่วยมิลลิวินาที
  
การปรับปรุงประสิทธิภาพการเขียน
    หากเราเขียนข้อมูลจำนวนมากไปยังฐานข้อมูล เราสามารถใช้พารามิเตอร์
    print=silent เพื่อปรับปรุงประสิทธิภาพการเขียนและลดการใช้แบนด์วิดท์
    ได้ ในลักษณะการเขียนปกติ เซิร์ฟเวอร์จะตอบกลับด้วยข้อมูล JSON ที่เขียน
    เมื่อระบุ print=silent เซิร์ฟเวอร์จะปิดการเชื่อมต่อทันที
    เมื่อได้รับข้อมูล ซึ่งจะช่วยลดการใช้แบนด์วิดท์
  
    ในกรณีที่เราส่งคำขอไปยังฐานข้อมูลหลายรายการ เราจะใช้การเชื่อมต่อ HTTPS ซ้ำได้โดยส่งคำขอ Keep-Alive ในส่วนหัว HTTP
  
เงื่อนไขข้อผิดพลาด
REST API จะแสดงรหัสข้อผิดพลาดในกรณีต่อไปนี้
| รหัสสถานะ HTTP | |
|---|---|
| 400 คำขอไม่ถูกต้อง | 
         เงื่อนไขข้อผิดพลาดอย่างใดอย่างหนึ่งต่อไปนี้ 
  | 
    
| 401 ไม่ได้รับอนุญาต | 
         เงื่อนไขข้อผิดพลาดอย่างใดอย่างหนึ่งต่อไปนี้ 
  | 
    
| 404 ไม่พบ | ไม่พบฐานข้อมูล Firebase ที่ระบุ | 
| 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ | เซิร์ฟเวอร์แสดงข้อผิดพลาด ดูรายละเอียดเพิ่มเติมได้ในข้อความแสดงข้อผิดพลาด | 
| 503 ไม่พร้อมให้บริการ | ฐานข้อมูลเรียลไทม์ของ Firebase ที่ระบุไม่พร้อมใช้งานชั่วคราว ซึ่งหมายความว่าระบบไม่ได้พยายามส่งคำขอ | 
การรักษาความปลอดภัยของข้อมูล
Firebase มีภาษาด้านความปลอดภัยที่ช่วยให้เรากำหนดได้ว่าผู้ใช้รายใดมีสิทธิ์อ่านและเขียนไปยังโหนดต่างๆ ของข้อมูล อ่านข้อมูลเพิ่มเติมได้ใน Realtime Database Security Rules
ตอนนี้เราได้พูดถึงการบันทึกข้อมูลแล้ว ในส่วนถัดไปเราจะมาดูวิธีดึงข้อมูลจากฐานข้อมูล Firebase ผ่าน REST API กัน