Festlegen der Body-Daten einer WebRequest

120

Ich erstelle eine Webanforderung in ASP.NET und muss dem Text eine Reihe von Daten hinzufügen. Wie mache ich das?

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

Antworten:

105

Mit HttpWebRequest.GetRequestStream

Codebeispiel von 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);

Aus einem meiner eigenen 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
quelle
Hallo Torbjorn, ich verwende die Anfrage, damit ich die 'request.GetResponse ();' erhalten kann. Wie würde das im obigen Beispiel funktionieren?
William Calleja
Wenn Sie GetRequestStream () aufrufen, wird der Server aufgerufen. Sie müssten dies also am Ende des obigen Beispiels hinzufügen.
Torbjörn Hansson
1
Gibt es eine Möglichkeit, den vollständigen Text in einem Anforderungsobjekt zu Debugging-Zwecken anzuzeigen? Ich habe versucht, es zu serialisieren und einen StreamReader zu verwenden, aber egal was ich tue, ich kann die Daten, die ich gerade in die Anfrage geschrieben habe, nicht sehen.
James
Fan-Freaking-Tastic!
@ James, Sie sollten in der Lage sein, Fiddler oder Wireshark zu verwenden, um die vollständige Anfrage mit ihrem Körper zu sehen.
RayLoveless
48

Aktualisieren

Siehe meine andere SO-Antwort.


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
quelle
Vermissen Sie etwas? Wie ein httpWReq.Content = newStream; Sie verwenden Ihr newStream-Objekt nicht mit Ihrer webRequest.
Yogurtu
3
Um @ Yogurtus Frage der Vollständigkeit halber zu beantworten , schreibt das StreamObjekt, newStreamauf das verwiesen wird , direkt auf den Text der Anfrage. Der Zugriff erfolgt über den Anruf an HttpWReq.GetRequestStream(). Es ist nicht erforderlich, etwas anderes für die Anforderung festzulegen.
MojoFilter
0

Die Antworten in diesem Thema sind alle großartig. Ich möchte jedoch einen anderen vorschlagen. Höchstwahrscheinlich haben Sie eine API erhalten und möchten diese in Ihr c # -Projekt aufnehmen. Mit Postman können Sie den API-Aufruf dort einrichten und testen. Sobald er ordnungsgemäß ausgeführt wird, können Sie einfach auf 'Code' klicken und die Anforderung, an der Sie gearbeitet haben, wird in ac # snippet geschrieben. so was:

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

Der obige Code hängt vom Nuget-Paket RestSharp ab, das Sie einfach installieren können.

real_yggdrasil
quelle