Метод PUT (платформа служб данных ADO.NET)
В приведенных ниже списках и примерах описываются протоколы использования службами данных ADO.NET метода PUT. Описание другого поведения, необходимого для протокола передачи гипертекста, RFC 2616 см. в разделах Общие требования к HTTP (платформа служб данных ADO.NET) и PUT, POST и DELETE (платформа служб данных ADO.NET).
Следующие протоколы применяются только к запросам HTTP, использующим метод PUT.
Все успешно выполненные запросы PUT возвращают код ответа «204 Содержимое отсутствует».
Запрос PUT к ресурсу служб данных ADO.NET производит слияние содержимого запроса с текущим состоянием ресурса. Слияние выполняется с помощью сравнения каждого компонента тела запроса с ресурсом в том виде, в котором он существует на сервере.
Если в теле запроса имеется компонент, отсутствующий в ресурсе, то запрос представляет собой нарушение схемы и возвращается код ответа «422 Необрабатываемый объект».
Если компонент в теле запроса совпадает с компонентом ресурса, то продолжается процесс сравнения дочерних объектов элемента в теле запроса.
Запрос PUT на присвоение ресурсу значения NULL, если тип ресурса не допускает значения NULL, приводит к отображению кода ответа «422 Необрабатываемый объект».
Запрос PUT на присвоение ресурсу пустого значения, если тип ресурса не допускает пустого состояния, приводит к отображению кода ответа «422 Необрабатываемый объект».
Поскольку метод PUT должен быть идемпотентным, PUT нельзя использовать для вставки ресурсов в набор ресурсов. Другими словами, PUT не может реализовывать семантики добавления или создания, схожие с теми, которые реализует POST.
Любые аннотации к отложенному содержимому, присутствующие в полезных данных запроса, не учитываются.
Если URI запроса в заголовке HTTP не соответствует связанному URI в полезных данных запроса, то URI запроса имеет более высокий приоритет. Полезные данные обрабатываются, как если бы они включали значение URI запроса.
Если в теле запроса PUT содержатся ключи для ресурсов, используемые в рамках сериализации ресурса, значения этих ключей игнорируются. Значения ключей ресурсов нельзя обновить.
Типы, поддерживающие метод PUT
Приведенные ниже примеры представляют собой сводку по типам ресурсов, поддерживающим метод PUT. Запрос PUT к типу ресурса, поддерживающего метод PUT, может завершиться с ошибкой, если запрашивающий объект обладает недостаточными правами на данный ресурс. В этом случае, как описано в разделе Протокол передачи гипертекста, RFC 2616, запрос возвращает код ответа «401 Отсутствуют необходимые права доступа» или «403 Запрещено» в зависимости от того, приведет ли указание другого объекта для службы данных к успешному выполнению запроса.
В следующих примерах показаны конечные элементы в синтаксисе пути URI HTTP, которые поддерживают или не поддерживают метод PUT. В каждом примере приводится описание запроса PUT и предполагаемые результаты.
/<Набор_сущностей>
Пример конечного элемента URI
В следующем примере URI показано использование набора сущностей в качестве конечного элемента.
/Customers
Описание
Метод PUT не может использоваться для набора сущностей в качестве конечного элемента. Возвращается код ответа «405 Метод не поддерживается».
/<Набор_сущностей>(keyPredicate)
В следующем примере URI показано использование keyPredicate в качестве конечного элемента.
/Customers('ALFKI')
Описание
Поддерживает метод PUT.
Обновляет отдельный экземпляр типа ресурса, предоставленный телом запроса и идентифицированный с помощью keyPredicate
Глубокие обновления связанных типов не поддерживаются.
Поддерживает связывание стороны связи с количеством элементов, равным 1.
Обеспечивает связывание ресурса R1, идентифицируемого по keyPredicate, с существующими ресурсами:
Если R1 содержит только URI существующего ресурса R2, как значение перехода или ссылки, идентифицирующее сторону связи с количеством элементов, равным одному, то выполняется привязка R1 к R2.
Если R1 содержит URI и тело ресурса, то предполагается, что URI представляет существующий ресурс R2, который уже привязан к R1. После этого R2 обновляется с использованием значений, указанных в теле.
Если R1 содержит только тело и не содержит URI связанного ресурса R2 в виде значения перехода или ссылки, то возвращается ответ «400 Недопустимый запрос».
При отправке этому ресурсу полезных данных, содержащих только литеральное значение NULL, отобразится код ответа «400 Недопустимый запрос».
Значение свойства или свойств, составляющих ключ ресурса, не может быть обновлено. Если в полезных данных запроса PUT представлены новые значения, они игнорируются.
В следующем примере URI показано использование числового ключа предиката в качестве конечного элемента. Этот код обновляет Product #123 и категорию, с которой он связан; он выполняет повторную привязку связанной категории.
/Products(123)
Формат JSON
{
__metadata:{ uri="/Products(123)",
type="NorthwindModel.Product" },
Name:"New product name"
Category : { __metadata: {uri:"/Category(2)" } }
}
/<свойство_перехода> или /<свойство_ссылки>
В следующем примере URI показано использование свойств переходов и ссылок в качестве конечных элементов.
/Customers('ALFKI')/Orders
/Customers('ALKFI')/Orders(1)
/Products(1)/Category
(это работает только для связи, заканчивающейся с количеством элементов, равным 1)
Описание
Поддерживает метод PUT.
Если свойство перехода или ссылки идентифицирует отдельный ресурс или конец связи с количеством элементов, равным одному):
- Использует такую же семантику, что и
/<ResourceSet>(keyPredicate)
, за исключением того, что тело запроса, которое содержит только значение NULL, отменяет привязку ресурса к ресурсу, идентифицируемому с помощью предпоследнего сегмента URI.
- Использует такую же семантику, что и
Если свойство перехода или ссылки идентифицирует несколько ресурсов или конец связи «ко многим»:
- Не поддерживается, возвращается код ответа «405 Метод не поддерживается».
/<Сложный_тип>
В следующем примере URI показано использование сложного типа в качестве конечного элемента.
/Customers('ALFKI')/Address
Описание
Поддерживает метод PUT.
Обновляет сложный тип, идентифицируемый конечным элементом запроса URI вместе с содержимым тела запроса.
Поддерживает глубокие обновления.
Полезные данные запроса могут содержать обновляемое содержимое вложенных сложных типов. Для таких обновлений не существует максимальной глубины, так как глубина остается в содержащем экземпляре типа ресурса.
/<Свойство>
В следующем примере URI показано использование свойства в качестве конечного элемента:
/Customers('ALFKI')/FirstName
Описание
Поддерживает метод PUT.
Поддерживает обновление значения свойства.
Это свойство может принимать значение NULL.
- JSON использует примитив NULL.
/<Свойство>/$значение
В следующем примере URI показано использование значения свойства в качестве конечного элемента:
/Customers('ALFKI')/FirstName/$value
Описание
Поддерживает метод PUT.
Поддерживает обновление необработанного значения свойства.
Не предоставляет способа установки значения NULL.
MIME-тип тела запроса должен совпадать с MIME-типом для типа ресурса на сервере.
Тело запроса нулевой длины устанавливает пустое значение свойства, если тип свойства допускает такое состояние; в противном случае возвращается код ответа «422 Необрабатываемый объект».
/<Имя_операции_службы>
В следующем примере URI показано использование имени операции службы в качестве конечного элемента:
/CustomersByCity?city='London'
Описание
Не поддерживает метод PUT.
Команда PUT не определена для операций служб данных ADO.NET.
Возвращает код ответа «405 Метод не поддерживается».
Ограничение кругового пути для запроса PUT
Платформа служб данных ADO.NET поддерживает сценарий кругового пути, использующий запрос GET для конкретного кода URI для возврата полезных данных. Типичным сценарием является изменение некоторых данных и передача тех же полезных данных в запрос PUT для этого кода URI. Данная процедура не работает, если свойство в сущности является не ключом, а столбцом идентификаторов. Единственным обходным путем является изменение столбца идентификаторов в файле языка определения структуры схемы (SSDL) на вычисленное свойство.
См. также
Понятия
Метод GET в классе HttpWebRequest (платформа служб данных ADO.NET)
Метод PUT в классе HttpWebRequest (платформа служб данных ADO.NET)
Запрос POST в классе HttpWebRequest (платформа служб данных ADO.NET)
Запрос DELETE в классе HttpWebRequest (платформа служб данных ADO.NET)
PUT, POST и DELETE (платформа служб данных ADO.NET)