.NET: Veri ve okuma yanıtı ile POST göndermenin en kolay yolu


179

Şaşırtıcı bir şekilde, .NET BCL'de söyleyebileceğimden neredeyse bu kadar basit bir şey yapamıyorum:

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

Yukarıdaki bu varsayımsal kod, verileri içeren bir HTTP POST yapar ve Poststatik bir sınıftaki bir yöntemin yanıtını döndürür Http.

Bu kadar kolay bir şey olmadan kaldığımızdan, bir sonraki en iyi çözüm nedir?

Verileri içeren bir HTTP POST'u nasıl gönderirim ve yanıtın içeriğini nasıl alırım?


Bu aslında benim için mükemmel çalıştı ... stickler.de/en/information/code-snippets/…
Jamie Tabone

Yanıtlar:


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

Bunlara aşağıdakilere ihtiyacınız olacak:

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

Statik bir yöntem / sınıf kullanmakta ısrarcıysanız:

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

Sonra basitçe:

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

3
HTTP üstbilgileri üzerinde daha fazla denetim istiyorsanız, aynı şeyi HttpWebRequest kullanarak ve RFC2616 ( w3.org/Protocols/rfc2616/rfc2616.txt ) kullanarak deneyebilirsiniz . Jball ve BFree'nin cevapları bu girişimi takip ediyor.
Chris Hutchinson

9
Bu örnek aslında asıl sorunun önemli bir parçası olan yanıtı okumuyor!
Jon Watte

4
Yanıtı okumak için yapabilirsiniz string result = System.Text.Encoding.UTF8.GetString(response). Bu cevabı bulduğum soru.
jporcenaluk

WebClient System.Net'te bulunmadığından, Windows 8.1 için bir Windows Mağazası uygulaması oluşturmaya çalışıyorsanız bu yöntem artık çalışmaz. Bunun yerine, Ramesh'in cevabını kullanın ve "bekliyor" un kullanımını inceleyin.
Stephen Wylie

2
Ben artı bir tane olacak, ama cevabınızı geliştirmek için yanıtı okuma hakkında @jporcenaluk yorum eklemelisiniz.
Corgalore

78

HttpClient kullanarak: Windows 8 uygulama geliştirme konusunda, bununla karşılaştım.

var client = new HttpClient();

var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("pqpUserName", "admin"),
        new KeyValuePair<string, string>("password", "test@123")
    };

var content = new FormUrlEncodedContent(pairs);

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

if (response.IsSuccessStatusCode)
{


}

6
Ayrıca daha temiz kılan bir Sözlük <String, String> ile çalışır.
Peter Hedberg

23
ŞİMDİYE KADAR EN İYİ CEVAP .. Ah lordlara teşekkür ederim, teşekkür ederim seni seviyorum. Zorlanıyordum .. 2 FREAKNG HAFTA .. bütün yazılarımı görmelisin. ARGHH ÇALIŞIYOR, YEHAAA <hugs>
Jimmyt1988

1
Mümkün Kullanmadığınız gerektiğini Not .Resultile Asynckullanımını - aramaların awaitUI iş parçacığı engellemez sağlamak için. Ayrıca, basit bir new[]liste yanı sıra çalışacaktır; Sözlük kodu temizleyebilir, ancak bazı HTTP işlevlerini azaltır.
Matt DeKrey

1
Günümüzde (2016) bu en iyi cevaptır. HttpClient, WebClient'ten daha yenidir (en çok oy verilen cevap) ve bazı faydaları vardır: 1) HTTP'nin mucitlerinden biri olan Henrik F Nielson tarafından üzerinde çalışılan iyi bir asenkron programlama modeli vardır ve API'yi bu şekilde tasarlamıştır. HTTP standardını izlemeniz kolaydır; 2) .Net framework 4.5 tarafından desteklenir, bu nedenle öngörülebilir gelecek için bazı garantili destek seviyesine sahiptir; 3) Ayrıca diğer platformlarda kullanmak istiyorsanız kütüphanenin xcopyable / taşınabilir çerçeve sürümüne sahiptir - .Net 4.0, Windows Phone vb ...
Luis Gouveia

httpclient ile dosya gönderme
Darshan Dave

47

WebRequest kullanın . Gönderen Scott Hanselman'ın :

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

32
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();
}

12

Şahsen, bir http post yapmak ve yanıt almak için en basit yaklaşım WebClient sınıfını kullanmak olduğunu düşünüyorum. Bu sınıf detayları güzelce özetliyor. MSDN belgelerinde tam kod örneği bile vardır.

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

Sizin durumunuzda, UploadData () yöntemini istiyorsunuz. (Yine, bir kod örneği belgelere dahil edilmiştir)

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

UploadString () muhtemelen de çalışır ve bir seviye daha soyutlar.

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


+1 Bunu çerçevede yapmanın bir çok yolu olduğundan şüpheleniyorum.
jball

7

Bu eski bir iplik olduğunu biliyorum, ama umarım biraz yardımcı olur.

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

HttpRequest nedir? Bana "yok" hatası veriyor.
Rahul Khandelwal

6

Diğer cevapların birkaç yaşında olduğu göz önüne alındığında, şu anda yardımcı olabilecek düşüncelerim şunlardır:

En basit yol

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
}

Daha Pratik Bir Örnek

Genellikle bilinen türler ve JSON ile ilgileniyoruz, böylece bu fikri aşağıdaki gibi çok sayıda uygulama ile daha da genişletebilirsiniz:

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
}

Buna nasıl bir örnek verilebilir:

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

5

Bu sahte kod gibi bir şey kullanabilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.