Configurar los datos corporales de una WebRequest

122

Estoy creando una solicitud web en ASP.NET y necesito agregar un montón de datos al cuerpo. ¿Cómo puedo hacer eso?

var request = HttpWebRequest.Create(targetURL);
request.Method = "PUT";
response = (HttpWebResponse)request.GetResponse();
William Calleja
fuente

Respuestas:

107

Con HttpWebRequest.GetRequestStream

Ejemplo de código de http://msdn.microsoft.com/en-us/library/d4cek6cc.aspx

string postData = "firstone=" + inputData;
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1 = encoding.GetBytes (postData);

// Set the content type of the data being posted.
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

// Set the content length of the string being posted.
myHttpWebRequest.ContentLength = byte1.Length;

Stream newStream = myHttpWebRequest.GetRequestStream ();

newStream.Write (byte1, 0, byte1.Length);

De uno de mi propio código:

var request = (HttpWebRequest)WebRequest.Create(uri);
request.Credentials = this.credentials;
request.Method = method;
request.ContentType = "application/atom+xml;type=entry";
using (Stream requestStream = request.GetRequestStream())
using (var xmlWriter = XmlWriter.Create(requestStream, new XmlWriterSettings() { Indent = true, NewLineHandling = NewLineHandling.Entitize, }))
{
    cmisAtomEntry.WriteXml(xmlWriter);
}

try 
{    
    return (HttpWebResponse)request.GetResponse();  
}
catch (WebException wex)
{
    var httpResponse = wex.Response as HttpWebResponse;
    if (httpResponse != null)
    {
        throw new ApplicationException(string.Format(
            "Remote server call {0} {1} resulted in a http error {2} {3}.",
            method,
            uri,
            httpResponse.StatusCode,
            httpResponse.StatusDescription), wex);
    }
    else
    {
        throw new ApplicationException(string.Format(
            "Remote server call {0} {1} resulted in an error.",
            method,
            uri), wex);
    }
}
catch (Exception)
{
    throw;
}
Torbjörn Hansson
fuente
Hola Torbjorn, estoy usando la solicitud para poder obtener el 'request.GetResponse ();', en el ejemplo anterior, ¿cómo funcionaría?
William Calleja
Cuando llama a GetRequestStream (), realiza la llamada al servidor. Entonces, tendrías que agregar eso al final del ejemplo anterior.
Torbjörn Hansson
1
¿Hay alguna forma de ver el texto completo dentro de un objeto de solicitud para fines de depuración? Intenté serializarlo e intenté usar un StreamReader, pero no importa lo que haga, no puedo ver los datos que acabo de escribir en la solicitud.
James
Fan-jodidamente-fantástico!
@James, debería poder usar Fiddler o Wireshark para ver la solicitud completa con su cuerpo.
RayLoveless
49

Actualizar

Vea mi otra respuesta SO.


Original

var request = (HttpWebRequest)WebRequest.Create("https://example.com/endpoint");

string stringData = ""; // place body here
var data = Encoding.Default.GetBytes(stringData); // note: choose appropriate encoding

request.Method = "PUT";
request.ContentType = ""; // place MIME type here
request.ContentLength = data.Length;

var newStream = request.GetRequestStream(); // get a ref to the request body so it can be modified
newStream.Write(data, 0, data.Length);
newStream.Close();
Evan Mulawski
fuente
¿Te estás perdiendo algo? Como un httpWReq.Content = newStream; no está utilizando su objeto newStream con su webRequest.
Yogurtu
4
Para responder a la pregunta de @ Yogurtu sobre la integridad, el Streamobjeto que newStreamapunta a escribe directamente en el cuerpo de la solicitud. Se accede mediante la llamada a HttpWReq.GetRequestStream(). No es necesario establecer nada más en la solicitud.
MojoFilter
0

Las respuestas en este tema son geniales. Sin embargo me gustaría proponer otro. Lo más probable es que le hayan dado una api y la desee en su proyecto de c #. Con Postman, puede configurar y probar la llamada a la API allí y, una vez que se ejecute correctamente, simplemente haga clic en 'Código' y la solicitud en la que ha estado trabajando se escribe en ac # snippet. Me gusta esto:

var client = new RestClient("https://api.XXXXX.nl/oauth/token");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Basic   N2I1YTM4************************************jI0YzJhNDg=");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("grant_type", "password");
request.AddParameter("username", "[email protected]");
request.AddParameter("password", "XXXXXXXXXXXXX");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

El código anterior depende del paquete nuget RestSharp, que puede instalar fácilmente.

real_yggdrasil
fuente