HttpWebRequest POST (marco de trabajo de los servicios de datos de ADO.NET)

Se pueden agregar nuevos datos a los servicios de datos de ADO.NET mediante una solicitud POST HTTP. La solicitud POST se puede aplicar a conjuntos de entidades identificados mediante una clave, vínculos, propiedades de navegación y operaciones de servicio. Para obtener más información, vea Método POST (marco de trabajo de los servicios de datos de ADO.NET).

Solicitud POST para insertar una nueva entidad

Los datos que la solicitud POST insertará tienen formato de cadena que pasa a ser parte del cuerpo de la solicitud HTTP. Una solicitud POST primero identifica el conjunto de entidades Address del AdventureWorksModel mediante el identificador URI: "https://localhost:50781/AdvWksSalesS.svc/Address". Si la entidad que se va a modificar forma parte de una jerarquía de herencia, es necesario el elemento de sintaxis __metadata:

  "{__metadata:{Uri:'/Address/', " +
      "Type:'AdventureWorksModel.Address'}}"

En el bloque de código al final de esta descripción se muestra un ejemplo completo que usa la sintaxis de JSON para representar un elemento de datos nuevo del conjunto de entidades Address.

El código inserta una nueva entidad Address en el servicio de datos que implementa AdventureWorksModel. Se crea HttpWebRequest r con el URI del tipo de entidad que se va a insertar, https://localhost:50781/AdvWksSalesS.svc/Address, como el parámetro único de su constructor. La inicialización de varias variables que constituye los datos de las propiedades del nuevo elemento requiere la serialización en formatos JSON. La serialización DateTime es una conversión compleja que sería administrada mejor por una Biblioteca de código JSON (en inglés), pero aquí se incluye la serialización. Para obtener más información sobre la serialización de JSON, vea Reglas de serialización de JSON (marco de trabajo de los servicios de datos de ADO.NET). El entero asignado a stateProvinceId y el Guid asignado a rowGuid se serializan en la inicialización de la cadena requestPayload.

El cuerpo de la solicitud como ya se ha descrito, se asigna a una cadena denominada requestPayload. El método se establece en "POST". ContentType se asigna al protocolo json. La línea r.Accept = "application/json" indica al servidor que envíe la respuesta, si la hay, codificada utilizando el protocolo json.

Si el servicio está protegido con un esquema de autenticación basado en transporte como la autenticación básica HTTP, se pueden pasar las credenciales asignándolas a la solicitud. Para este ejemplo, se usa DefaultCredentials.

La solicitud r tiene formato de texto Unicode. Se usa una variable UTF8Encoding a fin de obtener la longitud de la solicitud en bytes para escribir los datos digitales en el objeto Stream de la solicitud. Se asigna el objeto HttpWebResponse al llamar a GetResponse en la solicitud. El código r.GetResponse envía los datos y obtiene la respuesta. Se usa otro objeto Stream, rspStm, para contener los datos devueltos por 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();
        
    }

Vea también

Conceptos

Método POST (marco de trabajo de los servicios de datos de ADO.NET)
HttpWebRequest PUT (marco de trabajo de los servicios de datos de ADO.NET)
HttpWebRequest GET (marco de trabajo de los servicios de datos de ADO.NET)
HttpWebRequest POST (marco de trabajo de los servicios de datos de ADO.NET)
HttpWebRequest DELETE (marco de trabajo de los servicios de datos de ADO.NET)
Requisitos HTTP comunes (marco de trabajo de los servicios de datos de ADO.NET)
Biblioteca cliente de .NET (marco de trabajo de los servicios de datos de ADO.NET)