บุรุษไปรษณีย์ Chrome: ความแตกต่างระหว่าง form-data, x-www-form-urlencoded และ raw คืออะไร


222

ฉันใช้ส่วนขยายบุรุษไปรษณีย์ Chrome สำหรับทดสอบบริการเว็บ

มีสามตัวเลือกสำหรับป้อนข้อมูล

ฉันเดาว่าrawสำหรับการส่ง JSON

ความแตกต่างระหว่างอีกสองคืออะไรform-dataและx-www-form-urlencoded?


11
ณ วันนี้มีตัวเลือกที่ 4 เช่นเดียวกับข้อมูลที่โพสต์ในเครื่องมือบุรุษไปรษณีย์ binary-
RBT

คำตอบ:


237

เหล่านี้เป็นชนิดเนื้อหาแบบฟอร์มอื่นที่กำหนดโดย W3C หากคุณต้องการส่งข้อความ / ข้อมูล ASCII แบบง่ายx-www-form-urlencodedจะทำงาน นี่คือค่าเริ่มต้น

แต่ถ้าคุณต้องส่งข้อความที่ไม่ใช่ ASCII หรือข้อมูลไบนารี่ขนาดใหญ่form-dataจะเป็นข้อมูลนั้น

คุณสามารถใช้Rawหากคุณต้องการส่งข้อความธรรมดาหรือ JSON หรือสตริงอื่น ๆ เช่นเดียวกับชื่อที่แนะนำบุรุษไปรษณีย์ส่งข้อมูลสตริงดิบของคุณเนื่องจากไม่มีการแก้ไข ประเภทของข้อมูลที่คุณกำลังส่งสามารถตั้งค่าได้โดยใช้ส่วนหัวของชนิดเนื้อหาจากดรอปดาวน์

สามารถใช้ไบนารีได้เมื่อคุณต้องการแนบข้อมูลที่ไม่ใช่ข้อความไปยังคำขอเช่นไฟล์วิดีโอ / เสียงรูปภาพหรือไฟล์ไบนารีอื่น ๆ

อ้างอิงถึงลิงค์นี้สำหรับการอ่านเพิ่มเติม: แบบฟอร์มในเอกสาร HTML


แล้วไบนารีล่ะ
RBT

ฉันมีรูปแบบที่มี 4 ช่องข้อความและ 1 ไฟล์อัพโหลดตอนนี้โปรดแนะนำฉันที่ตัวเลือก (แบบฟอร์มข้อมูลหรือ x-www-form-urlencoded) จะใช้ในการส่งค่า 5 ช่องเหล่านี้ในบุรุษไปรษณีย์? ขอบคุณล่วงหน้า.
Kamlesh

@Kamlesh ขออภัยสำหรับการตอบกลับล่าช้าฟิลด์คีย์ของข้อมูลใน Postman มีรายการแบบเลื่อนลงซึ่งคุณสามารถเลือกได้ว่าจะเป็นฟิลด์ข้อความหรือไฟล์ คุณสามารถตั้งค่าให้เป็นไฟล์แล้วเรียกดูไฟล์เพื่อแนบกับเนื้อหา หวังว่าจะช่วย
Basant Singh

88

สิ่งนี้จะอธิบายได้ดีกว่า: บุรุษไปรษณีย์

คำขอร่างกาย

ในขณะที่สร้างคำขอคุณจะต้องจัดการกับตัวแก้ไขคำร้องขอจำนวนมาก บุรุษไปรษณีย์ให้คุณส่งคำขอ HTTP เกือบทุกชนิด (หากคุณไม่สามารถส่งอะไรได้โปรดแจ้งให้เราทราบ!) ตัวแก้ไขเนื้อหาแบ่งออกเป็น 4 ส่วนและมีการควบคุมที่แตกต่างกันไปตามประเภทของร่างกาย

ข้อมูลแบบฟอร์ม

multipart / form-data เป็นการเข้ารหัสเริ่มต้นที่เว็บฟอร์มใช้เพื่อถ่ายโอนข้อมูล สิ่งนี้จำลองการกรอกแบบฟอร์มบนเว็บไซต์และส่ง ตัวแก้ไขข้อมูลฟอร์มช่วยให้คุณสามารถตั้งค่าคู่คีย์ / ค่า (ใช้ตัวแก้ไขคีย์ - ค่า) สำหรับข้อมูลของคุณ คุณสามารถแนบไฟล์เข้ากับกุญแจได้เช่นกัน โปรดทราบว่าเนื่องจากข้อ จำกัด ของข้อกำหนด HTML5 ไฟล์จะไม่ถูกเก็บไว้ในประวัติหรือคอลเลกชัน คุณจะต้องเลือกไฟล์อีกครั้งในเวลาที่ส่งคำขอ

urlencoded

การเข้ารหัสนี้เหมือนกับที่ใช้ในพารามิเตอร์ URL คุณเพียงแค่ต้องใส่คู่คีย์ / ค่าและบุรุษไปรษณีย์จะเข้ารหัสคีย์และค่าอย่างถูกต้อง โปรดทราบว่าคุณไม่สามารถอัปโหลดไฟล์ผ่านโหมดการเข้ารหัสนี้ อาจมีความสับสนระหว่าง form-data และ urlencoded ดังนั้นโปรดตรวจสอบกับ API ของคุณก่อน

ดิบ

คำขอดิบสามารถมีอะไรก็ได้ บุรุษไปรษณีย์ไม่ได้สัมผัสสตริงที่ป้อนในโปรแกรมแก้ไขข้อมูลดิบยกเว้นการแทนที่ตัวแปรสภาพแวดล้อม สิ่งที่คุณใส่ในพื้นที่ข้อความจะถูกส่งไปพร้อมกับคำขอ ตัวแก้ไข raw ให้คุณตั้งค่าประเภทการจัดรูปแบบพร้อมกับส่วนหัวที่ถูกต้องที่คุณควรส่งพร้อมกับเนื้อความดิบ คุณสามารถตั้งค่าส่วนหัวของ Content-Type ได้เช่นกัน โดยปกติคุณจะส่งข้อมูล XML หรือ JSON ที่นี่

ไบนารี่

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

UPDATE

ในฐานะที่เป็นออกแหลมโดยVkkที่WHATWG specพูด urlencoded เป็นประเภทการเข้ารหัสเริ่มต้นสำหรับรูปแบบ

ค่าเริ่มต้นที่ไม่ถูกต้องสำหรับแอตทริบิวต์เหล่านี้คือสถานะแอปพลิเคชัน / x-www-form-urlencoded ค่าเริ่มต้นที่ขาดหายไปสำหรับแอตทริบิวต์ enctype ก็เป็นสถานะแอปพลิเคชัน / x-www-form-urlencoded


5
หมอบุรุษไปรษณีย์ผิด ข้อมูลจำเพาะ HTML5 ของ WHATWG มีอยู่ที่html.spec.whatwg.org/multipage/ …กำหนดค่าเริ่มต้นของ "application / x-www-form-urlencoded" อย่างชัดเจนสำหรับแอตทริบิวต์ enctype ขององค์ประกอบแบบฟอร์ม กล่าวอีกนัยหนึ่ง "application / x-www-form-urlencoded" เป็นการเข้ารหัสเริ่มต้น (ในเงื่อนไข HTTP Content-Type) เว็บฟอร์มที่ใช้ในการถ่ายโอนข้อมูลไม่ใช่หลายส่วน / form-data ในการส่งคำขอโพสต์ HTTP ในการส่งแบบฟอร์มด้วยประเภทเนื้อหาของหลายส่วน / แบบฟอร์มข้อมูลหนึ่งจะต้องระบุอย่างชัดเจนว่าเป็นค่าประเภท
VKK

ดังนั้นอะไรคือความแตกต่างระหว่างform-data (ที่ป้อนด้วยคู่ของคีย์ - ค่าใน Postman UI) ที่ส่งมาพร้อมกับContent-Type: application/jsonheader และข้อมูลดิบที่ป้อนเป็น json เช่นเดียว{foo: bar}กับContent-Type: application/jsonส่วนหัวเดียวกัน?
Inigo

ด้วยข้อมูลแบบฟอร์มเป็นค่าคีย์คู่เนื้อหาชนิดเป็นแบบฟอร์มหลายข้อมูลแม้เมื่อคุณระบุส่วนหัว & ด้วยเนื้อหาดิบประเภทจะเป็นข้อความหรือสิ่งที่คุณได้ระบุไว้ในส่วนหัว
avck

20

multipart / form ข้อมูล

บันทึก. โปรดปรึกษาRFC2388สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอัปโหลดไฟล์รวมถึงปัญหาความเข้ากันได้ย้อนหลังความสัมพันธ์ระหว่าง "multipart / form-data" และประเภทเนื้อหาอื่น ๆ ปัญหาประสิทธิภาพการทำงาน ฯลฯ

โปรดปรึกษาภาคผนวกสำหรับข้อมูลเกี่ยวกับปัญหาด้านความปลอดภัยสำหรับแบบฟอร์ม

ประเภทเนื้อหา "application / x-www-form-urlencoded" นั้นไม่มีประสิทธิภาพในการส่งข้อมูลไบนารีหรือข้อความจำนวนมากที่มีอักขระที่ไม่ใช่ ASCII ควรใช้ชนิดเนื้อหา "multipart / form-data" สำหรับการส่งแบบฟอร์มที่มีไฟล์ข้อมูลที่ไม่ใช่ ASCII และข้อมูลไบนารี

ชนิดเนื้อหา "multipart / form ข้อมูล" ตามกฎของข้อมูล multipart MIME ทั้งหมดลำธารที่ระบุไว้ในRFC2045 คำจำกัดความของ "หลายส่วน / แบบฟอร์มข้อมูล" มีอยู่ในรีจิสทรี [IANA]

ข้อความ "multipart / form-data" มีชุดของชิ้นส่วนแต่ละอันแสดงถึงการควบคุมที่สำเร็จ ชิ้นส่วนจะถูกส่งไปยังตัวแทนการประมวลผลในลำดับเดียวกันการควบคุมที่เกี่ยวข้องปรากฏในสตรีมเอกสาร ขอบเขตส่วนหนึ่งไม่ควรเกิดขึ้นกับข้อมูลใด ๆ วิธีการนี้ทำอยู่นอกขอบเขตของข้อกำหนดนี้

เช่นเดียวกับประเภท MIME หลายส่วนแต่ละส่วนมีส่วนหัว "ประเภทเนื้อหา" ที่เป็นตัวเลือกซึ่งมีค่าเริ่มต้นเป็น "text / plain" ตัวแทนผู้ใช้ควรระบุส่วนหัว "Content-Type" พร้อมด้วยพารามิเตอร์ "charset"

แอพลิเคชัน / x-www ฟอร์ม urlencoded

นี่คือประเภทเนื้อหาเริ่มต้น แบบฟอร์มที่ส่งมาพร้อมกับประเภทเนื้อหานี้จะต้องได้รับการเข้ารหัสดังนี้:

ชื่อและค่าควบคุมจะถูกหลีกหนี อักขระช่องว่างจะถูกแทนที่ด้วย+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by% HH 'เครื่องหมายเปอร์เซ็นต์และเลขฐานสิบหกสองหลักแทนรหัส ASCII ของอักขระ ตัวแบ่งบรรทัดจะแสดงเป็นคู่ "CR LF" (เช่น%0D%0A'). The control names/values are listed in the order they appear in the document. The name is separated from the value by= 'และคู่ชื่อ / ค่าจะถูกแยกออกจากกันโดย `&'

application/x-www-form-urlencodedเนื้อความของข้อความ HTTP ที่ส่งไปยังเซิร์ฟเวอร์นั้นเป็นสตริงการสืบค้นขนาดยักษ์หนึ่งคู่ - ชื่อ / ค่าจะถูกคั่นด้วยเครื่องหมายและ (&) และชื่อจะถูกแยกออกจากค่าด้วยสัญลักษณ์เท่ากับ (=) ตัวอย่างของสิ่งนี้จะเป็น:

MyVariableOne=ValueOne&MyVariableTwo=ValueTwo

เนื้อหาประเภท "application / x-www ฟอร์ม urlencoded"จะไม่มีประสิทธิภาพในการส่งข้อมูลจำนวนมากไบนารีหรือข้อความที่มีอักขระที่ไม่ใช่ ASCII ควรใช้ชนิดเนื้อหา "multipart / form-data" สำหรับการส่งแบบฟอร์มที่มีไฟล์ข้อมูลที่ไม่ใช่ ASCII และข้อมูลไบนารี


15

นี่คือตัวอย่างเพิ่มเติมเพื่อดูข้อความดิบที่บุรุษไปรษณีย์ส่งผ่านในคำขอ คุณสามารถเห็นสิ่งนี้ได้โดยเปิดคอนโซลบุรุษไปรษณีย์:

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลแบบฟอร์ม

หัวข้อ

content-type: multipart/form-data; boundary=--------------------------590299136414163472038474

ร่างกาย

key1=value1key2=value2

x-www- ฟอร์ม urlencoded

หัวข้อ

Content-Type: application/x-www-form-urlencoded

ร่างกาย

key1=value1&key2=value2

ข้อความดิบ / ธรรมดา

หัวข้อ

Content-Type: text/plain

ร่างกาย

This is some text.

json ดิบ

หัวข้อ

Content-Type: application/json

ร่างกาย

{"key1":"value1","key2":"value2"}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.