Что такое HTTP-объект?


114

Не мог бы кто-нибудь описать мне, что такое HTTP-объект ?

Я читаю документацию HTTPClient, но не совсем понимаю, что это значит?


2
Я пришел сюда из этой статьи о HTTP: HTTP: протокол, который должен знать каждый веб-разработчик, если кто-то еще заходит сюда в поисках информации по этому вопросу.
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 . Кроме того, один более запутан, чем другой. Или наоборот.; - о)
Sz.

6
Обратите внимание, что термин «объект HTTP» больше не встречается в последних спецификациях HTTP 1.1 . Похоже, он устарел. Теперь мы можем просто придерживаться «полей заголовка» и «тела сообщения».
Ястребиный глаз Паркер,

15

Вот 3 простых случая:

Случай 1. Вы загружаете 3 файла за один запрос. Эти 3 файла представляют собой 3 объекта. Каждый из них имеет свое собственное Content-Typeобозначение, что это за файл.

Случай 2. Вы просматриваете веб-страницу. Браузер загрузил 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

На рисунке выше показаны три посредника (A, B и C) между пользовательским агентом и исходным сервером. Сообщение запроса или ответа, которое проходит по всей цепочке, проходит через четыре отдельных соединения.

  • Поля заголовка для сообщения или объекта

Есть несколько полей заголовков, которые в целом применимы как для сообщений запроса, так и для сообщений ответа, но не применяются к передаваемому объекту . Эти поля заголовка применяются только к передаваемому сообщению .

  • Поля заголовка для сообщения могут быть изменены по цепочке

Кодирование передачи ДОЛЖНО использоваться для указания любых кодировок передачи, применяемых приложением для обеспечения безопасной и правильной передачи сообщения. Кодирование передачи - это свойство сообщения, а не объекта, и поэтому МОЖЕТ быть добавлено или удалено любым приложением в цепочке запросов / ответов.

  • Связь между телом сообщения и телом объекта

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

где Transfer-Encodingможет быть "chunked", что означает, как передать сообщение, и Content-Encodingможет быть "gzip", что означает, как сжать объект.


Вау, спасибо за разъяснение отношения "часть-целое" между сущностью и сообщением! Остальное как бы добавляет путаницы, но в целом все равно стоит проголосовать. Ура!
Sz.

12

Это абстракция , представляющая запроса или ответа полезной нагрузки . JavaDoc ясно на своей цели и различные типы сущностей.


3
+1 за то, что он назвал его «полезной нагрузкой», что, наконец, добавляет некоторый смысл этому недействительному термину («объект»).
Sz.


2

HTTP - это протокол, который наблюдается при доступе к информации с удаленного компьютера через сеть. Обычно сеть - это Интернет, а удаленная машина - это сервер.

Когда вы запрашиваете информацию у человека А у человека Б, вы даете ему сообщение. (Запрос). Человек B отвечает вам (Ответ). Запрос и ответ - это типы сообщений HTTP.

Человек А может попросить Человека Б сделать что-нибудь вместо того, чтобы запрашивать информацию. Скажем, человек A хочет, чтобы человек B сохранил файл в безопасном месте. Итак, человек A передает этот файл (объект HTTP) человеку B и просит его что-то сделать (сообщение HTTP). В этом случае Person передает "Entity". В контексте HTTP Entity это полезная нагрузка, прикрепленная к сообщению.

Надеюсь, аналогия помогла.


2

Как сказано в комментарии @ hawkeye-parker, похоже, что Entity устарела. Выполните поиск в этом rfc 2014 года , и вы увидите XML-сущности и тело сообщения, но ничего о сущности Http.

Тем не менее, у HttpClient, а также у клиента JaxRS есть метод setEntity()and getEntity().

Учитывая принятый ответ, обе библиотеки ошибаются! HttpClient.setEntity()не удаляет ранее установленные заголовки.


Я нашел различие между «сущностью» (и связанными с ней «заголовками сущностей») и «сообщением» весьма полезным. Это быстро становится очевидным, когда вы проектируете сетевую библиотеку и выполняете анализ HTTP-сообщения и его различных воплощений, например, составного сообщения. К сожалению, новые RFC объединяют эти отдельные «классы» в один, и нам нужно ввести нашу собственную терминологию или придерживаться «Entity».
CouchDeveloper

1

HttpEntityэто то, что вы собираетесь передать в запросе (с заголовком) и что вы получаете в ответе. Для получения запроса мы передаем простую строку

 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 (протокол передачи гипертекста - HTTP / 1.1) :

сущность

Сообщения запроса и ответа МОГУТ передавать объект, если иное не ограничено методом запроса или кодом состояния ответа. Сущность состоит из полей заголовка сущности и тела сущности, хотя некоторые ответы будут включать только заголовки сущностей.

В двух словах: Entity может быть передан, и это может быть заголовок + тело или просто заголовок .

Поскольку это ссылка выше, я задерживаюсь на дополнительных комментариях.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.