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();
William Calleja
la source

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;
}
Torbjörn Hansson
la source
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();
Evan Mulawski
la source
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", "[email protected]");
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.

real_yggdrasil
la source