ความแตกต่างระหว่าง PUT, POST และ PATCH คืออะไร? [ปิด]


281

ความแตกต่างระหว่างวิธี PUT, POST และ PATCH ในโปรโตคอล HTTP คืออะไร?




12
การใช้สิ่งอื่นนอกเหนือจาก GET / POST นั้นบ้าใน API เว็บสมัยใหม่ ทำมากเกินไป URIs ที่ระบุในแอพที่ทันสมัยส่วนใหญ่ไม่ใช่ทรัพยากรที่จะถูกแทนที่อัพเดทและอื่น ๆ พวกเขาไม่ใช่เอกสาร ขั้นตอนเหล่านี้ถูกเรียก URI เองมักจะระบุทรัพยากรจริงนอกเหนือจากวิธีการที่เรียกใช้ ดังนั้นให้ใช้ GET สำหรับการสอบถามและ POST เมื่อคุณต้องการโพสต์ข้อมูล JSON หรือไฟล์ในเนื้อความของคำขอ IMO สิ่งอื่น ๆ กำลังพยายาม shoehorn ล้าสมัยแนวคิดเกี่ยวกับ URIs และการดำเนินการกับเอกสาร HTML แบบคงที่ให้เป็นสถาปัตยกรรมใหม่ที่ดูเหมือนไม่มีอะไรเหมือน
Triynko

1
คำตอบที่ยอดเยี่ยมทั้งหมด ฉันแค่ต้องการแบ่งปันคำตอบของความแตกต่างและเมื่อคุณควรใช้แต่ละคน
ฝึกอบรม

@Triynko และขั้นตอนที่คุณกำลังหมายที่จะเกี่ยวข้องกับการสร้าง , การลบและการเปลี่ยนแปลงของทรัพยากร ไม่มีวิธีที่ดีกว่าในการถ่ายทอดความคิดดังกล่าวกว่าที่จะสงบ ทำไมจะไม่ล่ะ?
КонстантинВан

คำตอบ:


200

ความแตกต่างระหว่าง PUT, POST, GET, DELETE และ PATCH ใน HTTP Verbs:

คำกริยา HTTP POST, GET, PUT, DELETE ที่ใช้กันมากที่สุดนั้นคล้ายกับ CRUD (สร้าง, อ่าน, อัปเดตและลบ) ในฐานข้อมูล เราระบุกิริยา HTTP เหล่านี้ในเมืองหลวงกรณี ดังนั้นด้านล่างคือการเปรียบเทียบระหว่างพวกเขา

  1. สร้าง - โพสต์
  2. อ่าน - รับ
  3. อัพเดท - ใส่
  4. ลบ - ลบ

PATCH:ส่งการแก้ไขบางส่วนให้กับทรัพยากร หากคุณต้องการอัปเดตเพียงหนึ่งฟิลด์สำหรับทรัพยากรคุณอาจต้องการใช้วิธีการ PATCH

หมายเหตุ:
เนื่องจาก POST, PUT, DELETE จะแก้ไขเนื้อหาการทดสอบด้วย Fiddler สำหรับ URL ด้านล่างเพียงแค่ทำการอัปเดต ไม่ลบหรือแก้ไขจริง เราสามารถเห็นรหัสสถานะเพื่อตรวจสอบว่ามีการแทรกการอัพเดตการลบหรือไม่

URL: http://jsonplaceholder.typicode.com/posts/

1) รับ:

GET เป็นวิธีการขอ HTTP แบบง่ายที่สุด เบราว์เซอร์ที่ใช้ในแต่ละครั้งที่คุณคลิกลิงก์หรือพิมพ์ URL ลงในแถบที่อยู่ แนะนำให้เซิร์ฟเวอร์ส่งข้อมูลที่ระบุโดย URL ไปยังไคลเอนต์ ข้อมูลไม่ควรถูกแก้ไขบนฝั่งเซิร์ฟเวอร์อันเป็นผลมาจากการร้องขอ GET ในกรณีนี้คำขอ GET เป็นแบบอ่านอย่างเดียว

การตรวจสอบกับ Fiddler หรือ PostMan: เราสามารถใช้ Fiddler เพื่อตรวจสอบการตอบสนอง เปิด Fiddler แล้วเลือกแท็บเขียน ระบุคำกริยาและ URL ดังแสดงด้านล่างและคลิกดำเนินการเพื่อตรวจสอบการตอบสนอง

กริยา: GET

url: http://jsonplaceholder.typicode.com/posts/

การตอบสนอง:คุณจะได้รับการตอบกลับเป็น:

"userId": 1, "id": 1, "title": "sunt aut ... ", "body": "quia et suscipit ... "

ในเส้นทาง“ ความสุข” (หรือไม่ใช่ข้อผิดพลาด) GET จะส่งคืนการแทนค่าใน XML หรือ JSON และรหัสตอบกลับ HTTP 200 (OK) ในกรณีที่เกิดข้อผิดพลาดส่วนใหญ่มักจะส่งคืน 404 (ไม่พบ) หรือ 400 (คำขอที่ไม่ดี)

2) โพสต์:

กริยา POST ส่วนใหญ่จะใช้เพื่อสร้างแหล่งข้อมูลใหม่ โดยเฉพาะอย่างยิ่งมันถูกใช้เพื่อสร้างทรัพยากรรอง นั่นคือผู้ใต้บังคับบัญชาทรัพยากรอื่น ๆ (เช่นผู้ปกครอง)

เมื่อสร้างสำเร็จให้ส่งคืนสถานะ HTTP 201 โดยส่งคืนส่วนหัว Location พร้อมลิงก์ไปยังทรัพยากรที่สร้างขึ้นใหม่พร้อมสถานะ 201 HTTP

การตรวจสอบกับ Fiddler หรือ PostMan: เราสามารถใช้ Fiddler เพื่อตรวจสอบการตอบสนอง เปิด Fiddler แล้วเลือกแท็บเขียน ระบุคำกริยาและ URL ดังแสดงด้านล่างและคลิกดำเนินการเพื่อตรวจสอบการตอบสนอง

กริยา: POST

url: http://jsonplaceholder.typicode.com/posts/

คำขอร่างกาย:

ข้อมูล: {หัวเรื่อง: 'foo', เนื้อหา: 'bar', หมายเลขผู้ใช้: 1000, รหัส: 1000}

การตอบสนอง:คุณจะได้รับรหัสตอบกลับเป็น 201

หากเราต้องการตรวจสอบบันทึกที่แทรกด้วย Id = 1,000 เปลี่ยนคำกริยาเป็น Get และใช้ url เดียวกันแล้วคลิก Execute

ดังที่ได้กล่าวไว้ก่อนหน้านี้ URL ข้างต้นอนุญาตให้อ่าน (GET) เท่านั้นเราไม่สามารถอ่านข้อมูลที่อัปเดตเป็นจริงได้

3) ใส่:

PUT ถูกใช้บ่อยที่สุดสำหรับความสามารถในการอัปเดต PUT-ing ไปยัง URI ทรัพยากรที่รู้จักพร้อมกับเนื้อความคำขอที่มีการแสดงการปรับปรุงใหม่ของทรัพยากรดั้งเดิม

การตรวจสอบกับ Fiddler หรือ PostMan: เราสามารถใช้ Fiddler เพื่อตรวจสอบการตอบสนอง เปิด Fiddler แล้วเลือกแท็บเขียน ระบุคำกริยาและ URL ดังแสดงด้านล่างและคลิกดำเนินการเพื่อตรวจสอบการตอบสนอง

กริยา: PUT

url: http://jsonplaceholder.typicode.com/posts/1

คำขอร่างกาย:

ข้อมูล: {หัวเรื่อง: 'foo', เนื้อหา: 'bar', userId: 1, Id: 1}

การตอบสนอง:เมื่ออัปเดตสำเร็จจะส่งคืน 200 (หรือ 204 หากไม่ส่งคืนเนื้อหาใด ๆ ในร่างกาย) จาก PUT

4) ลบ:

DELETE นั้นง่ายต่อการเข้าใจ มันถูกใช้เพื่อลบทรัพยากรที่ระบุโดย URI

เมื่อลบสำเร็จให้ส่งคืนสถานะ HTTP 200 (OK) พร้อมกับเนื้อหาการตอบกลับซึ่งอาจแสดงรายการที่ถูกลบ (มักต้องการแบนด์วิดท์มากเกินไป) หรือการตอบกลับแบบห่อ (ดูค่าส่งคืนด้านล่าง) ไม่ว่าจะเป็นหรือส่งคืนสถานะ HTTP 204 (ไม่มีเนื้อหา) โดยไม่มีเนื้อหาตอบกลับ กล่าวอีกนัยหนึ่งสถานะ 204 ที่ไม่มีเนื้อหาหรือการตอบสนองสไตล์ JSEND และสถานะ HTTP 200 เป็นคำตอบที่แนะนำ

การตรวจสอบกับ Fiddler หรือ PostMan: เราสามารถใช้ Fiddler เพื่อตรวจสอบการตอบสนอง เปิด Fiddler แล้วเลือกแท็บเขียน ระบุคำกริยาและ URL ดังแสดงด้านล่างและคลิกดำเนินการเพื่อตรวจสอบการตอบสนอง

กริยา: DELETE

url: http://jsonplaceholder.typicode.com/posts/1

การตอบสนอง:เมื่อลบสำเร็จจะส่งคืนสถานะ HTTP 200 (OK) พร้อมกับเนื้อหาการตอบกลับ

ตัวอย่างระหว่าง PUT และ PATCH

PUT

ถ้าฉันต้องเปลี่ยนชื่อของฉันจากนั้นส่งคำขอ PUT สำหรับอัปเดต:

{"first": "Nazmul", "last": "hasan"} ดังนั้นที่นี่เพื่ออัปเดตชื่อแรกเราจำเป็นต้องส่งพารามิเตอร์ทั้งหมดของข้อมูลอีกครั้ง

ปะ:

คำขอแก้ไขระบุว่าเราจะส่งข้อมูลที่เราต้องการแก้ไขโดยไม่ต้องแก้ไขหรือมีผลต่อส่วนอื่น ๆ ของข้อมูล ตัวอย่าง: หากเราต้องการอัปเดตเฉพาะชื่อแรกเราจะส่งเฉพาะชื่อแรกเท่านั้น

โปรดอ้างอิงลิงค์ด้านล่างสำหรับข้อมูลเพิ่มเติม:

https://jsonplaceholder.typicode.com/

https://github.com/typicode/jsonplaceholder#how-to

อะไรคือความแตกต่างหลักระหว่าง PATCH และ PUT

http://www.restapitutorial.com/lessons/httpmethods.html


62
PUT ไม่ได้รับการอัพเดต PUT สร้างหรือแทนที่เอนทิตีที่ URI ที่กำหนด ตามข้อกำหนด HTTP PUT คือ idempotent ใช่สามารถใช้เพื่ออัปเดตได้ แต่การคิดเพียงเพราะการอัปเดตไม่ถูกต้อง
Maladon

2
ฉันยอมรับ PUT ไม่ได้อัพเดตมันสามารถถูกแมปด้วยการแทนที่เพราะเมื่อคุณส่ง PUT มันจะแทนที่ทรัพยากรที่มีอยู่ แต่ถ้าเราส่งแพทช์มันจะแทนที่เฉพาะรายการที่ระบุเท่านั้น
Atul Chavan

1
เนื่องจาก PUT สามารถใช้สร้างได้ฉันไม่แน่ใจว่าคำตอบของคุณระบุว่าควรใช้อะไร
Rob P.

1
คำตอบนี้ดีกว่ามาก แต่ไม่ได้เปรียบเทียบกับ PATCH: stackoverflow.com/a/630475/2391795
Vadorequest

47

PUT = แทนที่ทรัพยากรทั้งหมดด้วยการเป็นตัวแทนใหม่ที่มีให้

PATCH = แทนที่ส่วนต่าง ๆ ของแหล่งข้อมูลด้วยค่าที่ให้ไว้และ | หรือส่วนอื่น ๆ ของทรัพยากรได้รับการอัปเดตที่คุณไม่ได้จัดเตรียมไว้ (เวลาประทับ) และ | หรือการอัปเดตทรัพยากรผลกระทบทรัพยากรอื่น ๆ (ความสัมพันธ์)

https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1


11

คำจำกัดความด้านล่างมาจากตัวอย่างในโลกแห่งความจริง

ภาพรวมตัวอย่าง
สำหรับทุกข้อมูลลูกค้าเรากำลังจัดเก็บตัวระบุเพื่อค้นหาข้อมูลลูกค้านั้นและเราจะส่งตัวระบุนั้นกลับไปยังลูกค้ารายนั้นเพื่อการอ้างอิง

  1. โพสต์

    • หากลูกค้าส่งข้อมูลโดยไม่มีตัวระบุใด ๆ โดยใช้วิธี POST เราจะจัดเก็บและกำหนดตัวระบุใหม่
    • หากลูกค้าส่งข้อมูลเดิมอีกครั้งโดยไม่มีตัวระบุใด ๆ โดยใช้วิธีการ POST เราจะจัดเก็บและกำหนดตัวระบุใหม่
    • หมายเหตุ : อนุญาตให้ทำซ้ำได้ที่นี่
  2. PUT

    • หากลูกค้าส่งข้อมูลด้วยตัวระบุเราจะตรวจสอบว่าตัวระบุนั้นมีอยู่หรือไม่ หากมีตัวระบุอยู่เราจะอัปเดตข้อมูลอื่นเราจะสร้างและกำหนดตัวระบุใหม่
  3. ปะ

    • หากลูกค้าส่งข้อมูลด้วยตัวระบุเราจะตรวจสอบว่าตัวระบุนั้นมีอยู่หรือไม่ หากมีตัวระบุอยู่เราจะอัปเดตข้อมูลมิฉะนั้นเราจะส่งข้อยกเว้น

หมายเหตุ: ในวิธีการใส่เราจะไม่ส่งข้อยกเว้นหากไม่พบตัวระบุ แต่ในวิธีการแก้ไขเรากำลังโยนข้อยกเว้นหากไม่พบตัวระบุ

แจ้งให้เราทราบหากคุณมีข้อสงสัยใด ๆ ข้างต้น


8

ประเภทคำขอ

  • สร้าง - โพสต์
  • อ่าน - รับ
  • สร้างหรืออัปเดต - PUT
  • ลบ - ลบ
  • อัพเดท - แพทช์

GET / PUT คือ idempotent PATCH อาจเป็น idempotent ในบางครั้ง

idempotent คืออะไร - หมายความว่าถ้าเราใช้การสืบค้นหลายครั้งมันก็ไม่ควรกระทบกับผลลัพธ์ของมัน (เอาท์พุทเดียวกันสมมติว่าวัวกำลังท้องและถ้าเราผสมพันธุ์อีกครั้งมันจะไม่สามารถตั้งครรภ์ได้หลายครั้ง)

get : -

รับง่าย รับข้อมูลจากเซิร์ฟเวอร์และแสดงให้ผู้ใช้เห็น

{
id:1
name:parth
email:x@x.com
}

post : -

สร้างทรัพยากรใหม่ที่ฐานข้อมูล มันหมายถึงมันจะเพิ่มข้อมูลใหม่ มันไม่ใช่ idempotent

put : -

สร้างทรัพยากรใหม่เพิ่มเป็นอย่างอื่น Idempotent เพราะมันจะอัพเดททรัพยากรเดียวกันทุกครั้งและผลลัพธ์จะเหมือนกัน อดีต - ข้อมูลเริ่มต้น

{
id:1
name:parth
email:x@x.com
}
  • ดำเนินการ put-localhost / 1 ใส่อีเมล: ppp@ppp.com
{
id:1
email:ppp@ppp.com
}

patch

ดังนั้นตอนนี้ขอแพทช์ PATCH สามารถ idempotent บางครั้ง

id:1
name:parth
email:x@x.com
}

ชื่อแพทช์: w

{
id:1
name:w
email:x@x.com
}
วิธี HTTP
รับใช่
หมายเลขโพสต์
ใส่ใช่
แพทช์ไม่มี *
ตัวเลือกใช่
หัวใช่
ลบใช่

แหล่งข้อมูล: Idempotent - Idempotency คืออะไร


idempotent "บางครั้ง" หมายถึงอะไรจริงๆ? idempotency กำหนดอะไร?
Polv

7

นี่คือคำอธิบายง่ายๆของทั้งหมด:

  • POSTสำหรับสร้างทรัพยากรเสมอ (ไม่สำคัญว่าจะทำซ้ำหรือไม่)
  • PUT ใช้สำหรับตรวจสอบว่ามีทรัพยากรอยู่จากนั้นอัปเดตมิฉะนั้นสร้างทรัพยากรใหม่
  • PATCHสำหรับอัพเดททรัพยากรอยู่เสมอ

5

ความแตกต่างหลักระหว่างคำร้องขอ PUTและPATCH :

สมมติว่าเรามีทรัพยากรที่มีชื่อและนามสกุลของบุคคล

ถ้าเราต้องการเปลี่ยนชื่อจากนั้นเราจะส่งคำขอวางสำหรับการปรับปรุง

{ "first": "Michael", "last": "Angelo" }

ที่นี่แม้ว่าเราจะเปลี่ยนชื่อเท่านั้นโดยคำขอ PUT เราจะต้องส่งพารามิเตอร์ทั้งตัวแรกและตัวสุดท้าย
กล่าวอีกนัยหนึ่งคือจำเป็นต้องส่งค่าทั้งหมดอีกครั้ง

อย่างไรก็ตามเมื่อเราส่งคำขอ PATCH เราจะส่งข้อมูลที่เราต้องการอัปเดตเท่านั้น กล่าวอีกนัยหนึ่งเราเพียงส่งชื่อเพื่ออัปเดตไม่จำเป็นต้องส่งนามสกุล


2

ตรรกะค่อนข้างแตกต่างระหว่าง PUT และ PATCH WRT ส่งข้อมูลเต็ม & บางส่วนเพื่อแทนที่ / อัปเดตตามลำดับ อย่างไรก็ตามเพียงสองจุดดังต่อไปนี้

  1. บางครั้ง POST ถูกพิจารณาว่าเป็นการอัพเดต wrt PUT สำหรับสร้าง
  2. HTTP ได้รับคำสั่ง / ตรวจสอบการส่งข้อมูลเต็มเทียบกับบางส่วนใน PATCH หรือไม่ มิฉะนั้น PATCH อาจจะค่อนข้างเหมือนกับอัพเดทใน PUT / POST

2

คิดแบบนี้ ...

POST - สร้าง

PUT - แทนที่

PATCH - อัปเดต

รับ - อ่าน

DELETE - ลบ


2
ผมอาจจะเพิ่มความแตกต่างนี้ : " PUT ในกรณีที่ลูกค้ากำหนดที่อยู่ส่งผลให้ทรัพยากรของ POST ถ้าเซิร์ฟเวอร์ที่ไม่ได้. "
รัฟฟิน

1

คำอธิบายที่ง่ายที่สุด:

POST - สร้างบันทึกใหม่

PUT - หากมีบันทึกอยู่ให้อัพเดทเป็นอื่นให้สร้างระเบียนใหม่

PATCH - อัปเดต

รับ - อ่าน

DELETE - ลบ


สิ่งนี้แตกต่างอย่างมากจากคำตอบของ Kwame ที่โพสต์เมื่อประมาณสองสัปดาห์ก่อนคุณ?
ruffin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.