PROPFIND
Метод HTTP
Спецификация HTTP-метода PROPFIND
Метод PROPFIND извлекает свойства, определенные на ресурсе, идентифицированном по Request-URI, если ресурс не имеет внутренних членов, или на ресурсе, идентифицированном по Request-URI и потенциально входящих в него ресурсах, если ресурс является коллекцией, имеющей внутренние URL-адреса членов. Все DAV-совместимые ресурсы ДОЛЖНЫ поддерживать метод PROPFIND и XML-элемент propfind
(раздел 14.20) вместе со всеми XML-элементами, определенными для использования с этим элементом.
Клиент ДОЛЖЕН передать заголовок Depth со значением "0", "1" или "бесконечность" с запросом PROPFIND. Серверы ДОЛЖНЫ поддерживать запросы глубины "0" и "1" на WebDAV-совместимых ресурсах и ДОЛЖНЫ поддерживать запросы "бесконечности". На практике поддержка запросов бесконечной глубины МОЖЕТ быть отключена из-за проблем с производительностью и безопасностью, связанных с таким поведением. Серверы ДОЛЖНЫ рассматривать запрос без заголовка Depth так, как если бы в него был включен заголовок Depth: infinity
.
Клиент может передать XML-элемент propfind
в теле метода запроса, описывающий, какая информация запрашивается. Это возможно:
- Запросить определенные значения свойств, назвав нужные свойства в элементе
prop
(порядок свойств здесь МОЖЕТ быть проигнорирован сервером), - Запросить значения свойств, определенных в данной спецификации (как минимум), плюс "мертвые" свойства, используя элемент
allprop
(элементinclude
может быть использован вместе сallprop
, чтобы указать серверу включить дополнительные живые свойства, которые могут быть не возвращены в противном случае), - Запросить список имен всех свойств, определенных на ресурсе, используя элемент
propname
.
Клиент может не предоставлять тело запроса. Пустое тело запроса PROPFIND ДОЛЖНО рассматриваться как запрос allprop
.
Заметим, что allprop
не возвращает значения для всех живых свойств. Серверы WebDAV все чаще имеют дорого вычисляемые или длинные свойства (см. [RFC3253] и [RFC3744]) и не возвращают все свойства. Вместо этого клиенты WebDAV могут использовать запросы propname
, чтобы узнать, какие живые свойства существуют, и запрашивать именованные свойства при получении значений. Для живого свойства, определенного в другом месте, в этом определении можно указать, будет ли это живое свойство возвращаться в запросах allprop
.
Все серверы ДОЛЖНЫ поддерживать возврат ответа с типом содержимого text/xml
или application/xml
, который содержит XML-элемент multistatus
, описывающий результаты попыток получения различных свойств.
Если при получении свойства возникла ошибка, то в ответ должен быть включен соответствующий результат ошибки. Запрос на получение значения несуществующего свойства является ошибкой и должен быть отмечен XML-элементом response
, содержащим значение статуса 404 (Not Found).
Следовательно, XML-элемент multistatus
для ресурса коллекции должен включать XML-элемент response
для каждого URL-члена коллекции, на любую глубину, которая была запрошена. Он НЕ ДОЛЖЕН включать никаких элементов response
для ресурсов, которые не являются WebDAV-совместимыми. Каждый элемент response
ДОЛЖЕН содержать элемент href
, содержащий URL ресурса, на котором определены свойства в XML-элементе prop
. Результаты PROPFIND по ресурсу коллекции возвращаются в виде плоского списка, порядок записей в котором не имеет значения. Обратите внимание, что ресурс может иметь только одно значение для свойства с данным именем, поэтому свойство может отображаться в ответах PROPFIND только один раз.
Свойства могут быть подвержены контролю доступа. В случае запросов allprop
и propname
, если доверитель не имеет права знать, существует ли определенное свойство, то свойство МОЖЕТ быть молча исключено из ответа.
Некоторые результаты PROPFIND МОГУТ быть кэшированы, но с осторожностью, поскольку для большинства свойств не существует механизма проверки кэша. Этот метод является безопасным и идемпотентным (см. раздел 9.1 [RFC2616]).
Описание метода PROPFIND
Пример для HTTP-метода PROPFIND
PROPFIND /data HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/58.0.3029.110 Safari/537
Depth: 1
Content-Type: text/xml; charset="utf-8"
Accept-Language: de-DE,de;q=0.5
Connection: keep-alive
HTTP/1.1 207 Multi-Status
Content-Type: text/xml; charset="utf-8"
Content-Length: 453
Date: Mon, 31 July 2023 14:58:12 GMT
Server: Apache/2.4.7 (Ubuntu)
Cache-Control: no-cache