Запрос POST в классе HttpWebRequest (платформа служб данных ADO.NET)
Новые данные можно добавлять в службы данных ADO.NET, используя запрос HTTP POST. Запрос POST можно применять к наборам сущностей, определяемым ключом, ссылками, свойствами навигации и операциями службы. Дополнительные сведения см. в разделе Метод POST (платформа служб данных ADO.NET).
Запрос POST для вставки новой сущности
Данные, вставляемые запросом POST, форматируются как строка, которая становится частью тела запроса HTTP. Сначала запрос POST определяет набор сущностей Address
в модели AdventureWorksModel
с помощью URI: "https://localhost:50781/AdvWksSalesS.svc/Address"
. Если изменяемая сущность является частью иерархии наследования, требуется элемент синтаксиса __metadata
:
"{__metadata:{Uri:'/Address/', " +
"Type:'AdventureWorksModel.Address'}}"
Полный пример использования синтаксиса JSON для представления нового элемента данных набора сущностей Address
приводится в блоке кода в конце этого описания.
Код вставляет новую сущность Address
в службу данных, которая выполняет развертывание AdventureWorksModel
. Запрос HttpWebRequest r
создается с помощью URI вставляемого типа сущности, https://localhost:50781/AdvWksSalesS.svc/Address
, используемого в качестве единственного параметра конструктора. Для инициализации нескольких переменных, составляющих данные свойств нового элемента, требуется сериализация в форматах JSON. Сериализация DateTime — это сложное преобразование, которое лучше предоставить библиотеке кода JSON, но в этом примере сериализация включена. Дополнительные сведения о сериализации JSON см. в разделе Правила сериализации JSON (платформа служб данных ADO.NET). Целое число, присвоенное параметру stateProvinceId
, и идентификатор Guid
, присвоенный параметру rowGuid
, сериализуются в ходе инициализации строки requestPayload
.
Тело запроса, как уже было сказано, заносится в строку с именем requestPayload
. Используется метод "POST"
. В качестве ContentType
указывается протокол json
. Строка r.Accept = "application/json"
сообщает серверу о необходимости передать ответ, если он есть, закодированный с помощью протокола json
.
Если служба защищена схемой проверки подлинности на основе транспорта, такой как базовая проверка подлинности HTTP, учетные данные можно передавать, задавая их запросу. В этом примере используются учетные данные DefaultCredentials
.
Запрос r
форматируется как текст в Юникоде. Переменная UTF8Encoding используется для получения длины запроса в байтах, чтобы записать цифровые данные в объект запроса Stream. Объект HttpWebResponse
получает значение путем вызова метода GetResponse
применительно к запросу. Код r.GetResponse
передает данные и получает ответ. Другой объект Stream, rspStm
, используется для хранения данных, которые возвращает метод GetResponseStream
.
HttpWebRequest r =
WebRequest.Create("https://localhost:50781/AdvWksSalesS.svc/Address")
as HttpWebRequest;
DateTime creationDate = DateTime.Now;
// Convert the date to JSON format.
long ticks = (creationDate.ToUniversalTime().Ticks -
(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks) / 10000;
Int32 stateProvinceId = 79;
Guid rowGuid = Guid.NewGuid();
// __metadata is only required if inheritance is used.
string requestPayload = "{__metadata:{Uri:'/Address/', " +
"Type:'AdventureWorksModel.Address'}, " +
"AddressLine1:'703 NW 170th St.', " +
"City:'Kirkland', StateProvinceID:" +
stateProvinceId.ToString() +
", PostalCode:'98021', rowguid:'" +
rowGuid.ToString() +
"', ModifiedDate:'\\/Date(" + ticks + ")\\/'}";
r.Method = "POST";
UTF8Encoding encoding = new UTF8Encoding();
r.ContentLength = encoding.GetByteCount(requestPayload);
r.Credentials = CredentialCache.DefaultCredentials;
r.Accept = "application/json";
r.ContentType = "application/json";
//Write the payload to the request body.
using ( Stream requestStream = r.GetRequestStream())
{
requestStream.Write(encoding.GetBytes(requestPayload), 0,
encoding.GetByteCount(requestPayload));
}
try
{
HttpWebResponse response = r.GetResponse() as HttpWebResponse;
string responseBody = "";
using (Stream rspStm = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(rspStm))
{
textBoxResponse.Text = textBoxResponse.Text +
"Response Description: " + response.StatusDescription;
textBoxResponse.Text = textBoxResponse.Text +
"Response Status Code: " + response.StatusCode;
textBoxResponse.Text = textBoxResponse.Text + "\r\n\r\n";
responseBody = reader.ReadToEnd();
}
}
textBoxResponse.Text = "Success: " + response.StatusCode.ToString();
}
catch (System.Net.WebException ex)
{
textBoxResponse.Text = textBoxResponse.Text +
"Exception message: " + ex.Message;
textBoxResponse.Text = textBoxResponse.Text +
"\r\nResponse Status Code: " + ex.Status;
textBoxResponse.Text = textBoxResponse.Text + "\r\n\r\n";
// get error details sent from the server
StreamReader reader = new StreamReader(ex.Response.GetResponseStream());
textBoxResponse.Text = textBoxResponse.Text + reader.ReadToEnd();
}
См. также
Понятия
Метод POST (платформа служб данных ADO.NET)
Метод PUT в классе HttpWebRequest (платформа служб данных ADO.NET)
Метод GET в классе HttpWebRequest (платформа служб данных ADO.NET)
Запрос POST в классе HttpWebRequest (платформа служб данных ADO.NET)
Запрос DELETE в классе HttpWebRequest (платформа служб данных ADO.NET)
Общие требования к HTTP (платформа служб данных ADO.NET)
.Клиентская библиотека .NET (платформа служб данных ADO.NET)