wake-up-neo.com

.NET: Einfachste Methode zum Senden von POST mit Daten und Leseantworten

Zu meiner Überraschung kann ich nach dem, was ich in .NET BCL sagen kann, bei weitem nicht so einfach vorgehen:

byte[] response = Http.Post
(
    url: "http://dork.com/service",
    contentType: "application/x-www-form-urlencoded",
    contentLength: 32,
    content: "home=Cosby&favorite+flavor=flies"
);

Dieser obige hypothetische Code erstellt einen HTTP-POST mit Daten und gibt die Antwort einer Post -Methode auf eine statische Klasse Http zurück.

Was ist die nächstbeste Lösung, da uns so einfach nichts bleibt?

Wie sende ich ein HTTP POST mit Daten UND erhalte den Inhalt der Antwort?

   using (WebClient client = new WebClient())
   {

       byte[] response =
       client.UploadValues("http://dork.com/service", new NameValueCollection()
       {
           { "home", "Cosby" },
           { "favorite+flavor", "flies" }
       });

       string result = System.Text.Encoding.UTF8.GetString(response);
   }

Sie benötigen diese beinhaltet:

using System;
using System.Collections.Specialized;
using System.Net;

Wenn Sie darauf bestehen, eine statische Methode/Klasse zu verwenden:

public static class Http
{
    public static byte[] Post(string uri, NameValueCollection pairs)
    {
        byte[] response = null;
        using (WebClient client = new WebClient())
        {
            response = client.UploadValues(uri, pairs);
        }
        return response;
    }
}

Dann einfach:

var response = Http.Post("http://dork.com/service", new NameValueCollection() {
    { "home", "Cosby" },
    { "favorite+flavor", "flies" }
});
285

Verwendung von HttpClient: Bei der Entwicklung von Windows 8-Apps bin ich auf dieses Problem gestoßen.

var client = new HttpClient();

var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("pqpUserName", "admin"),
        new KeyValuePair<string, string>("password", "[email protected]")
    };

var content = new FormUrlEncodedContent(pairs);

var response = client.PostAsync("youruri", content).Result;

if (response.IsSuccessStatusCode)
{


}
74
Ramesh

Verwenden Sie WebRequest . Von Scott Hanselman :

public static string HttpPost(string URI, string Parameters) 
{
   System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
   req.Proxy = new System.Net.WebProxy(ProxyString, true);
   //Add these, as we're doing a POST
   req.ContentType = "application/x-www-form-urlencoded";
   req.Method = "POST";
   //We need to count how many bytes we're sending. 
   //Post'ed Faked Forms should be name=value&
   byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
   req.ContentLength = bytes.Length;
   System.IO.Stream os = req.GetRequestStream ();
   os.Write (bytes, 0, bytes.Length); //Push it out there
   os.Close ();
   System.Net.WebResponse resp = req.GetResponse();
   if (resp== null) return null;
   System.IO.StreamReader sr = 
         new System.IO.StreamReader(resp.GetResponseStream());
   return sr.ReadToEnd().Trim();
}
47
jball
private void PostForm()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dork.com/service");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    string postData ="home=Cosby&favorite+flavor=flies";
    byte[] bytes = Encoding.UTF8.GetBytes(postData);
    request.ContentLength = bytes.Length;

    Stream requestStream = request.GetRequestStream();
    requestStream.Write(bytes, 0, bytes.Length);

    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);

    var result = reader.ReadToEnd();
    stream.Dispose();
    reader.Dispose();
}
33
BFree

Persönlich denke ich, der einfachste Ansatz, um einen http-Beitrag zu erstellen und die Antwort zu erhalten, ist die Verwendung der WebClient-Klasse. Diese Klasse abstrahiert schön die Details. Es gibt sogar ein vollständiges Codebeispiel in der MSDN-Dokumentation.

http://msdn.Microsoft.com/en-us/library/system.net.webclient (VS.80) .aspx

In Ihrem Fall möchten Sie die UploadData () -Methode. (Auch hier ist ein Codebeispiel in der Dokumentation enthalten.)

http://msdn.Microsoft.com/en-us/library/tdbbwh0a (VS.80) .aspx

UploadString () wird wahrscheinlich auch funktionieren und es wird eine weitere Ebene entfernt.

http://msdn.Microsoft.com/en-us/library/system.net.webclient.uploadstring (VS.80) .aspx

12
David

Ich weiß, dass dies ein alter Thread ist, aber ich hoffe, es hilft jemandem.

public static void SetRequest(string mXml)
{
    HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp("http://dork.com/service");
    webRequest.Method = "POST";
    webRequest.Headers["SOURCE"] = "WinApp";

    // Decide your encoding here

    //webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.ContentType = "text/xml; charset=utf-8";

    // You should setContentLength
    byte[] content = System.Text.Encoding.UTF8.GetBytes(mXml);
    webRequest.ContentLength = content.Length;

    var reqStream = await webRequest.GetRequestStreamAsync();
    reqStream.Write(content, 0, content.Length);

    var res = await httpRequest(webRequest);
}
7
Murali

Sie können so etwas wie diesen Pseudocode verwenden:

request = System.Net.HttpWebRequest.Create(your url)
request.Method = WebRequestMethods.Http.Post

writer = New System.IO.StreamWriter(request.GetRequestStream())
writer.Write("your data")
writer.Close()

response = request.GetResponse()
reader = New System.IO.StreamReader(response.GetResponseStream())
responseText = reader.ReadToEnd
5
paludarium

Angesichts der Tatsache, dass andere Antworten ein paar Jahre alt sind, sind hier meine Gedanken, die hilfreich sein könnten:

Einfachster Weg

private async Task<string> PostAsync(Uri uri, HttpContent dataOut)
{
    var client = new HttpClient();
    var response = await client.PostAsync(uri, dataOut);
    return await response.Content.ReadAsStringAsync();
    // For non strings you can use other Content.ReadAs...() method variations
}

Ein praktischeres Beispiel

Oft haben wir es mit bekannten Typen und JSON zu tun, sodass Sie diese Idee mit einer beliebigen Anzahl von Implementierungen erweitern können, z.

public async Task<T> PostJsonAsync<T>(Uri uri, object dtoOut)
{
    var content = new StringContent(JsonConvert.SerializeObject(dtoOut));
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

    var results = await PostAsync(uri, content); // from previous block of code

    return JsonConvert.DeserializeObject<T>(results); // using Newtonsoft.Json
}

Ein Beispiel, wie dies genannt werden könnte:

var dataToSendOutToApi = new MyDtoOut();
var uri = new Uri("https://example.com");
var dataFromApi = await PostJsonAsync<MyDtoIn>(uri, dataToSendOutToApi);
4
ToddBFisher