HTTP Entity คืออะไร?


114

มีใครช่วยอธิบายให้ฉันฟังได้ไหมว่าเอนทิตี HTTPคืออะไร

ฉันกำลังอ่านเอกสาร HTTPClient แต่ฉันไม่เข้าใจจริงๆว่าหมายถึงอะไร?


2
ฉันมาที่นี่จากบทความนี้ใน HTTP: HTTP: The Protocol นักพัฒนาเว็บทุกคนต้องรู้ว่ามีใครผ่านมาที่นี่เพื่อค้นหาข้อมูลเกี่ยวกับเรื่องนี้
Mason240

2
โปรดทราบว่าคำว่า "เอนทิตี HTTP" ไม่ปรากฏในข้อกำหนดล่าสุดของ HTTP 1.1อีกต่อไป ดูเหมือนว่าเลิกใช้แล้ว ตอนนี้เราสามารถใช้ "ช่องส่วนหัว" และ "เนื้อหาข้อความ" ได้แล้ว
Hawkeye Parker

คำตอบ:


139

HTTP นิติบุคคลเป็นส่วนใหญ่ของการร้องขอ HTTP หรือการตอบสนองประกอบด้วยบางส่วนของส่วนหัวและร่างกายถ้าปัจจุบัน ดูเหมือนว่าจะเป็นคำขอหรือการตอบกลับทั้งหมดที่ไม่มีคำขอหรือบรรทัดสถานะ (แม้ว่าจะมีการพิจารณาเฉพาะฟิลด์ส่วนหัวบางฟิลด์เท่านั้น)

เพื่อเป็นตัวอย่าง; นี่คือคำขอ:

POST /foo HTTP/1.1          # Not part of the entity.
Content-Type: text/plain    # ┬ The entity is from this line down...
Content-Length: 1234        # │
                            # │
Hello, World! ...           # ┘

และการตอบสนอง:

HTTP/1.1 200 OK             # Not part of the entity.
Content-Length: 438         # ┬ The entity is from this line down...
Content-Type: text/plain    # │
                            # │
Response body ...           # ┘

3
โฮสต์ไม่ใช่ฟิลด์ส่วนหัวของเอนทิตี
Gumbo

ฉันคิดว่านิติบุคคลที่ใช้แทน& &ไม่ว่าจะเป็นนิติบุคคลด้วยเหรอ? อะไรคือความแตกต่าง?
CodyBugstein

1
@Imray: &เป็นHTMLอ้างอิงเอนทิตีตัวอักษรไม่ที่เดียวกันHTTP Entity
maerics

2
@lmray: พวกเขาเป็นหน่วยงานที่แตกต่างกันอย่างสิ้นเชิง ;) (อันหนึ่งเกี่ยวกับการเข้ารหัสสตริงในข้อความ HTMLอีกอันเกี่ยวกับการจัดโครงสร้างข้อมูลเมื่อเบราว์เซอร์และเซิร์ฟเวอร์พูดคุยกันผ่านโปรโตคอล HTTPนอกจากนี้อีกอันหนึ่งจะสับสนมากกว่าอีกอันหรือในทางกลับกัน; - o)
Sz

6
โปรดทราบว่าคำว่า "เอนทิตี HTTP" ไม่ปรากฏในข้อกำหนดล่าสุดของ HTTP 1.1อีกต่อไป ดูเหมือนว่าเลิกใช้แล้ว ตอนนี้เราสามารถใช้ "ช่องส่วนหัว" และ "เนื้อหาข้อความ" ได้
ฮ็อคปาร์กเกอร์

15

นี่คือ 3 กรณีง่ายๆ:

กรณีที่ 1. คุณกำลังอัปโหลด 3 ไฟล์ในคำขอเดียว ทั้ง 3 ไฟล์เป็น 3 เอนทิตี แต่ละคนมีของตัวเองContent-Typeเพื่อระบุว่าเป็นไฟล์ประเภทใด

กรณีที่ 2. คุณกำลังดูหน้าเว็บ เบราว์เซอร์ดาวน์โหลดไฟล์ html เป็นเอนทิตีในพื้นหลัง เนื่องจากสามารถอัปเดตเพจได้อย่างต่อเนื่องคุณจึงอาจได้รับเอนทิตีที่แตกต่างไปจากเดิม

กรณีที่ 3. คุณมีไฟล์304 Not Modified. ไม่มีการโอนนิติบุคคล

กล่าวได้ว่าเอนทิตีคือส่วนที่เป็นทางเลือกภายในข้อความ http (ไม่ว่าจะเป็นการร้องขอหรือการตอบกลับ) ดังนั้นจึงเป็นความสัมพันธ์" บางส่วน " ระหว่างเอนทิตีและข้อความ

ฟิลด์ส่วนหัวบางช่องใช้กับMessagelike Transfer-Encodingอธิบายวิธีการถ่ายโอนข้อความระหว่างตัวกลางดังนั้นอาจถูกเพิ่มหรือลบโดยแอปพลิเคชันใด ๆ ตามห่วงโซ่การร้องขอ / การตอบกลับ (hop-by-hop headers ) ในการเปรียบเทียบฟิลด์ส่วนหัวเหล่านั้นใช้กับEntityคุณสมบัติบางอย่างซึ่งอธิบายขนาดของเอนทิตีประเภทอัลกอริทึมการบีบอัด ฯลฯ ...

อ่านเพิ่มเติมอ้างจาก RFC 2616 ส่วน 1.4, 4.5 และ 4.3:

  • ห่วงโซ่การร้องขอ / การตอบกลับ
     request chain -------------------------------------->
   UA -----v----- A -----v----- B -----v----- C -----v----- O
      <------------------------------------- response chain

รูปด้านบนแสดงตัวกลางสามตัว (A, B และ C) ระหว่างตัวแทนผู้ใช้และเซิร์ฟเวอร์ต้นทาง คำขอหรือข้อความตอบกลับที่เดินทางทั้งห่วงโซ่จะผ่านการเชื่อมต่อแยกกันสี่รายการ

  • ฟิลด์ส่วนหัวสำหรับข้อความหรือเอนทิตี

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

  • ช่องส่วนหัวของข้อความสามารถเปลี่ยนแปลงได้ตลอดสาย

ต้องใช้ Transfer-Encoding เพื่อระบุรหัสการโอนใด ๆ ที่แอปพลิเคชันใช้เพื่อให้แน่ใจว่าการถ่ายโอนข้อความนั้นปลอดภัยและเหมาะสม Transfer-Encoding เป็นคุณสมบัติของข้อความไม่ใช่ของเอนทิตีดังนั้นจึงอาจถูกเพิ่มหรือลบโดยแอปพลิเคชันใด ๆ ตามห่วงโซ่การร้องขอ / การตอบกลับ

  • ความสัมพันธ์ระหว่างเนื้อหาข้อความและเนื้อหาเอนทิตี

message-body = Transfer-Encoding( Content-Encoding(entity-body) )

โดยที่Transfer-Encodingอาจ "เป็นกลุ่ม" ซึ่งหมายถึงวิธีการถ่ายโอนข้อความและContent-Encodingอาจเป็น "gzip" ที่หมายถึงวิธีการบีบอัดเอนทิตี


ว้าวขอบคุณสำหรับการชี้แจงความสัมพันธ์ "บางส่วน" ระหว่างเอนทิตีและข้อความ! ส่วนที่เหลือ 'เพิ่มความสับสน แต่โดยรวมแล้วก็ยังคุ้มค่ากับการโหวต ไชโย!
Sz.

12

มันเป็นนามธรรมที่เป็นตัวแทนของการร้องขอหรือการตอบสนองน้ำหนักบรรทุก JavaDocเป็นที่ชัดเจนเกี่ยวกับวัตถุประสงค์และประเภทนิติบุคคลต่างๆ


3
+1 สำหรับการเรียกมันว่า "payload" ซึ่งในที่สุดก็เพิ่มความหมายบางอย่างให้กับคำที่เป็นโมฆะนั้น ("entity")
Sz.


2

HTTP เป็นโปรโตคอลที่สังเกตได้เมื่อเข้าถึงข้อมูลจากเครื่องระยะไกลผ่านเครือข่าย โดยปกติเครือข่ายคืออินเทอร์เน็ตและเครื่องระยะไกลเป็นเซิร์ฟเวอร์

เมื่อคุณขอข้อมูลจากบุคคล A ถึงบุคคล B คุณจะส่งข้อความถึงเขา (ขอใช้บริการ) บุคคล B ตอบกลับคุณ (การตอบกลับ) คำขอและการตอบกลับเป็นประเภทข้อความ HTTP

บุคคล A สามารถขอให้บุคคล B ทำบางสิ่งแทนการขอข้อมูล พูดว่าบุคคล A ต้องการให้บุคคล B จัดเก็บไฟล์ในตำแหน่งที่ปลอดภัย ดังนั้นบุคคล A จึงส่งไฟล์นั้น (เอนทิตี HTTP) ไปยังบุคคล B และขอให้เขาทำบางอย่าง (ข้อความ HTTP) ในกรณีนี้บุคคลกำลังส่งผ่าน "เอนทิตี" ในบริบทของ HTTP Entity เป็น payload ที่แนบมาพร้อมกับข้อความ

หวังว่าการเปรียบเทียบจะช่วยได้


2

ตามที่กล่าวไว้ในความคิดเห็นของ @ hawkeye-parker ดูเหมือนว่าเอนทิตีจะเลิกใช้แล้ว ทำให้การค้นหาในนี้ 2014 RFC , และคุณจะเห็นเกี่ยวกับหน่วยงาน XML และเนื้อหาของข้อความ แต่ไม่มีอะไรที่เกี่ยวกับนิติบุคคล Http

อย่างไรก็ตาม HttpClient แต่ยังรวมถึงไคลเอนต์ JaxRS มีsetEntity()และgetEntity()วิธีการ

เมื่อพิจารณาจากคำตอบที่ยอมรับแล้วห้องสมุดทั้งสองผิด! HttpClient.setEntity()จะไม่ลบส่วนหัวที่ตั้งไว้ก่อนหน้านี้


ฉันพบว่าความแตกต่างของ "Entity" (และ "entity-headers" ที่เกี่ยวข้อง) และ "Message" มีประโยชน์มากทีเดียว สิ่งนี้จะเห็นได้ชัดอย่างรวดเร็วเมื่อคุณออกแบบไลบรารีเครือข่ายและทำการวิเคราะห์ข้อความ HTTP และรูปแบบต่างๆเช่นข้อความหลายส่วน น่าเสียดายที่ RFC ใหม่ได้รวม "คลาส" ที่แตกต่างกันเหล่านี้เข้าด้วยกันและเราจำเป็นต้องแนะนำคำศัพท์ของเราเองหรือใช้ "เอนทิตี"
CouchDeveloper

1

HttpEntityคือสิ่งที่คุณจะส่งผ่านในคำขอ (พร้อมส่วนหัว) และสิ่งที่คุณได้รับในการตอบกลับ สำหรับ Get Request เรากำลังส่งผ่าน String ง่ายๆ

 HttpHeaders headers = new HttpHeaders();
 headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
 HttpEntity<String> entity = new HttpEntity<String>(headers);

สำหรับโพสต์เราจะผ่านคลาสเอนทิตีที่สมบูรณ์

public String createProducts(@RequestBody Product product) {
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    HttpEntity<Product> entity = new HttpEntity<Product>(product,headers);

    return restTemplate.exchange(
             "http://localhost:8080/products", HttpMethod.POST, entity, String.class
           ).getBody();
}

0

เอนทิตีเป็นสิ่งที่คล้ายข้อความประกอบด้วยส่วนหัวซึ่งข้อมูลเมตาเช่นตำแหน่งที่ตั้งภาษาการเข้ารหัส ...

และเป็นทางเลือกของเนื้อหา - เนื้อหาถูกจัดรูปแบบ ฯลฯ ตามที่ระบุไว้ในส่วนหัว


0

ในบรรดาคำตอบที่ดีที่เรามีที่นี่ฉันเชื่อว่ามันคุ้มค่าที่จะพูดถึงบางสิ่งที่มาจากRFC 2616โดยตรง(Hypertext Transfer Protocol - HTTP / 1.1) :

เอกลักษณ์

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

สรุป AA:กิจการอาจมีการโอนและมันสามารถเป็นส่วนหัว + ร่างกายหรือเพียงแค่ส่วนหัว

เนื่องจากมีลิงก์ด้านบนฉันจึงควบคุมตัวเองในการแสดงความคิดเห็นเพิ่มเติม

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