Définition des données corporelles d'une WebRequest


122

Je crée une requête Web dans ASP.NET et je dois ajouter un tas de données au corps. Comment je fais ça?

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

Réponses:


107

Avec HttpWebRequest.GetRequestStream

Exemple de code 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);

À partir d'un de mes propres codes:

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;
}

Salut Torbjorn, j'utilise la requête pour pouvoir obtenir le 'request.GetResponse ();', dans l'exemple ci-dessus comment cela fonctionnerait-il?
William Calleja

Lorsque vous appelez GetRequestStream (), il effectue l'appel au serveur. Vous devrez donc ajouter cela à la fin de l'exemple ci-dessus.
Torbjörn Hansson

1
Existe-t-il un moyen de voir le texte intégral à l'intérieur d'un objet de requête à des fins de débogage? J'ai essayé de le sérialiser et j'ai essayé d'utiliser un StreamReader, mais quoi que je fasse, je ne peux pas voir les données que je viens d'écrire à la demande.
James

Fan-freaking-tastic!

@James, vous devriez pouvoir utiliser Fiddler ou WireShark pour voir la requête complète avec son corps.
RayLoveless

49

Mettre à jour

Voir mon autre réponse 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();

Vous manquez quelque chose? Comme un httpWReq.Content = newStream; vous n'utilisez pas votre objet newStream avec votre webRequest.
Yogurtu

4
Pour répondre à la question d'exhaustivité de @ Yogurtu, l' Streamobjet qui newStreampointe vers écrit directement dans le corps de la requête. Il est accessible par l'appel à HttpWReq.GetRequestStream(). Il n'est pas nécessaire de définir quoi que ce soit d'autre sur la demande.
MojoFilter

0

Les réponses à ce sujet sont toutes excellentes. Cependant j'aimerais en proposer un autre. Il est fort probable que vous ayez reçu une API et que vous le souhaitiez dans votre projet c #. En utilisant Postman, vous pouvez y installer et tester l'appel d'API et une fois qu'il s'exécute correctement, vous pouvez simplement cliquer sur «Code» et la requête sur laquelle vous avez travaillé est écrite dans l'extrait de code ac #. comme ça:

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", "development+XXXXXXXX-admin@XXXXXXX.XXXX");
request.AddParameter("password", "XXXXXXXXXXXXX");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

Le code ci-dessus dépend du package nuget RestSharp, que vous pouvez facilement installer.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.