正確にはHTTPエンティティとは何ですか?


114

誰かが正確にHTTPエンティティとは何かを私に説明してくれませんか?

HTTPClientのドキュメントを読んでいますが、その意味がよくわかりません。


2
私はHTTPに関するこの記事からここに来ました:HTTP:このトピックに関する情報を探して他の誰かがここにやってきたかどうか、すべてのWeb開発者が知っておくべきプロトコル
Mason240 2013

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 2013

1
@Imray:HTML文字エンティティ参照であり、HTTPエンティティ&は異なります
maerics 2013

2
@lmray:それらは完全に異なるエンティティです。;)(1つが約されるエンコードで文字列をHTMLテキスト、その他が約ある構造化時にオーバー互いにブラウザとサーバトーク情報HTTPプロトコルまた、1は複数の他よりも混乱している、またはその逆;。。。 - o)
Sz。

6
「HTTPエンティティ」という用語は、最新のHTTP 1.1仕様には含まれていません。廃止されたようです。これで、「ヘッダーフィールド」と「メッセージ本文」だけを使用できます。
Hawkeye Parker

15

簡単な3つのケースを次に示します。

ケース1. 1つのリクエストで3つのファイルをアップロードしています。これらの3つのファイルは3つのエンティティです。それぞれにContent-Type、ファイルの種類を示す独自のファイルがあります。

ケース2. Webページを表示しています。ブラウザがバックグラウンドでエンティティとしてhtmlファイルをダウンロードしました。ページは継続的に更新される可能性があるため、後で完全に異なるエンティティを取得する可能性があります。

ケース3。 304 Not Modifiedます。エンティティは転送されていません。

つまり、Entityはhttpメッセージ(要求または応答のいずれか)内のオプションのペイロードであるため、EntityとMessageの間の「部分全体」の関係です。

いくつかのヘッダーフィールドは、に適用Messageたい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

上の図は、ユーザーエージェントと配信元サーバーの間の3つの仲介者(A、B、C)を示しています。チェーン全体を移動する要求または応答メッセージは、4つの個別の接続を通過します。

  • メッセージまたはエンティティのヘッダーフィールド

要求メッセージと応答メッセージの両方に一般的に適用できるヘッダーフィールドがいくつかありますが、転送されるエンティティには適用されません。これらのヘッダーフィールドは、送信されるメッセージにのみ適用されます

  • メッセージのヘッダーフィールドはチェーンに沿って変更できます

Transfer-Encodingは、メッセージの安全で適切な転送を保証するためにアプリケーションによって適用される転送コーディングを示すために使用する必要があります。Transfer-Encodingは、エンティティではなくメッセージのプロパティであるため、要求/応答チェーンに沿ってアプリケーションによって追加または削除される場合があります。

  • メッセージ本文とエンティティ本文の関係

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

ここで、Transfer-Encoding「チャンク」はメッセージの転送方法を意味し、Content-Encoding「gzip」はエンティティの圧縮方法を表します。


うわー、エンティティとメッセージの「部分全体」の関係を明確にしてくれてありがとう!残りはちょっと混乱を増しますが、全体としては、まだ賛成票を投じる価値があります。乾杯!
Sz。

12

これは、リクエストまたはレスポンスのペイロードを表す抽象概念です。Javadocは、その目的や様々なエンティティタイプに明らかです。


3
+1を「ペイロード」と呼ぶと、最終的にその無効な用語(「エンティティ」)に意味が追加されます。
Sz。


2

HTTPは、ネットワーク経由でリモートマシンから情報にアクセスするときに観察されるプロトコルです。通常、ネットワークはインターネットで、リモートマシンはサーバーです。

AからBに情報を要求するとき、彼にメッセージを与えます。(リクエスト)。人Bがあなたに返信します(応答)。要求と応答はHTTPメッセージタイプです。

人物Aは、情報を要求する代わりに、人物Bに何かを依頼することができます。たとえば、人物Aが人物Bに安全な場所にファイルを保存することを望んでいるとします。したがって、人物Aはそのファイル(HTTPエンティティ)を人物Bに渡し、何か(HTTPメッセージ)を実行するように依頼します。この場合、Personは「エンティティ」を渡します。HTTPエンティティのコンテキストでは、メッセージに添付されたペイロードです。

アナロジーが役に立てば幸い。


2

@ hawkeye-parkerのコメントで述べたように、エンティティは廃止されたようです。作成し、この2014 RFCで検索して、あなたは、HTTPエンティティに関するXMLエンティティとメッセージ本文、何もについて表示されます。

それでも、HttpClientだけでなくJaxRSクライアントにもsetEntity()and getEntity()メソッドがあります。

受け入れられた答えを考えると、両方のライブラリが間違っています!HttpClient.setEntity()以前に設定されたヘッダーは削除されません。


「Entity」(および関連する「entity-headers」)と「Message」の区別は非常に役立ちました。これは、ネットワークライブラリを設計し、HTTPメッセージとそのさまざまな具体化(マルチパートメッセージなど)の分析を実行すると、すぐに明らかになります。残念ながら、新しいRFCはこれらの別個の「クラス」を1つにマージするため、独自の用語を導入するか、「エンティティ」を使用する必要があります。
CouchDeveloper

1

HttpEntityRequest(ヘッダー付き)で渡すものとResponseで受け取るものです。Getリクエストでは、単純な文字列を渡します

 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)から直接来るものについて言及する価値があると思います:

エンティティ

リクエストおよびレスポンスメッセージは、リクエストメソッドまたはレスポンスステータスコードによって制限されていない限り、エンティティを転送する場合があります。エンティティはエンティティヘッダーフィールドとエンティティボディで構成されますが、一部の応答にはエンティティヘッダーのみが含まれます。

一言で言えば、エンティティは転送される可能性があり、それはheader + body、または単なるheaderです。

上記のリンクがあるので、私は追加のコメントをすることを控えています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.