.NET: วิธีที่ง่ายที่สุดในการส่ง POST พร้อมข้อมูลและตอบกลับการอ่าน


179

ด้วยความประหลาดใจของฉันฉันไม่สามารถทำอะไรง่าย ๆ อย่างนี้จากสิ่งที่ฉันสามารถบอกได้ใน. NET BCL:

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

รหัสนี้สมมุติข้างต้นทำให้ HTTP POST กับข้อมูลและผลตอบแทนการตอบสนองจากที่วิธีการในระดับคงที่PostHttp

เมื่อเราถูกทิ้งไว้โดยไม่มีอะไรง่าย ๆ นี่เป็นทางออกที่ดีที่สุดต่อไปคืออะไร?

ฉันจะส่ง HTTP POST พร้อมข้อมูลและรับเนื้อหาของการตอบกลับได้อย่างไร


มันใช้งานได้จริงอย่างสมบูรณ์แบบสำหรับฉัน ... stickler.de/en/information/code-snippets/
Jamie Tabone

คำตอบ:


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

คุณจะต้องมีสิ่งเหล่านี้รวมถึง:

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

หากคุณยืนกรานที่จะใช้วิธีการ / คลาสคงที่:

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

จากนั้นเพียง:

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

3
หากคุณต้องการควบคุมส่วนหัว HTTP มากขึ้นคุณสามารถลองใช้ HttpWebRequest และอ้างอิง RFC2616 ( w3.org/Protocols/rfc2616/rfc2616.txt ) ได้ คำตอบจาก jball และ BFree ติดตามความพยายามนั้น
Chris Hutchinson

9
ตัวอย่างนี้ไม่ได้อ่านคำตอบจริงซึ่งเป็นส่วนสำคัญของคำถามเดิม!
Jon Watte

4
string result = System.Text.Encoding.UTF8.GetString(response)หากต้องการอ่านการตอบสนองที่คุณสามารถทำได้ นี่คือคำถามที่ฉันพบคำตอบ
jporcenaluk

วิธีนี้จะไม่ทำงานอีกต่อไปหากคุณพยายามสร้างแอพ Windows Store สำหรับ Windows 8.1 เนื่องจากไม่พบ WebClient ใน System.Net ให้ใช้คำตอบของ Ramesh แทนและดูการใช้งานของ "คอย"
สตีเฟ่นไวลี

2
ฉันจะบวกสิ่งนี้ด้วย แต่คุณควรรวม @jporcenaluk ความคิดเห็นเกี่ยวกับการอ่านคำตอบเพื่อปรับปรุงคำตอบของคุณ
Corgalore

78

ใช้ HttpClient: เท่าที่ฉันกังวลเกี่ยวกับการพัฒนาแอพ Windows 8 ฉันเจอสิ่งนี้

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
ทำงานร่วมกับพจนานุกรม <String, String> ซึ่งทำให้ทำความสะอาด
Peter Hedberg

23
คำตอบที่ดีที่สุดเท่าที่เคยมีมา .. โอ้ขอบคุณท่านขุนนางขอบคุณฉันรักคุณ ฉันดิ้นรน .. 2 สัปดาห์ FREAKNG .. คุณควรเห็นโพสต์ทั้งหมดของฉัน ARGHH การทำงานของ YEHAAA <hugs>
Jimmyt1988

1
โปรดทราบว่าหากเป็นไปได้คุณไม่ควรใช้.ResultกับการAsyncโทร - ใช้awaitเพื่อให้แน่ใจว่าเธรด UI ของคุณจะไม่บล็อก นอกจากนี้ยังใช้งานง่ายnew[]เช่นเดียวกับรายการ; พจนานุกรมอาจล้างรหัส แต่จะลดฟังก์ชันการทำงาน HTTP บางอย่าง
Matt DeKrey

1
ทุกวันนี้ (2016) คำตอบนี้ดีที่สุด HttpClient ใหม่กว่า WebClient (คำตอบที่โหวตมากที่สุด) และมีประโยชน์เหนือกว่า: 1) มันมีรูปแบบการเขียนโปรแกรม async ที่ดีซึ่งทำงานโดย Henrik F Nielson ซึ่งเป็นหนึ่งในนักประดิษฐ์ของ HTTP และเขาออกแบบ API ดังนั้น ง่ายสำหรับคุณที่จะทำตามมาตรฐาน HTTP; 2) ได้รับการสนับสนุนโดย. NET Framework 4.5 ดังนั้นจึงมีบางระดับที่รับประกันการสนับสนุนสำหรับอนาคตอันใกล้ 3) นอกจากนี้ยังมีไลบรารี่รุ่น xcopyable / portable-framework ของไลบรารีหากคุณต้องการใช้กับแพลตฟอร์มอื่น - .Net 4.0, Windows Phone ฯลฯ ...
Luis Gouveia

วิธีการส่งไฟล์ด้วย httpclient
Darshan Dave

47

ใช้WebRequest จาก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();
}

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

โดยส่วนตัวแล้วฉันคิดว่าวิธีที่ง่ายที่สุดในการโพสต์ http และรับการตอบกลับคือใช้คลาส WebClient ชั้นนี้มีรายละเอียดเป็นนามธรรม แม้จะมีตัวอย่างรหัสแบบเต็มในเอกสาร MSDN

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

ในกรณีของคุณคุณต้องการวิธี UploadData () (อีกครั้งตัวอย่างรหัสรวมอยู่ในเอกสารประกอบ)

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

UploadString () อาจใช้งานได้เช่นกันและมันจะย่อให้อยู่อีกระดับหนึ่ง

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


+1 ฉันสงสัยว่ามีหลายวิธีในการทำเช่นนี้ในกรอบ
jball

7

ฉันรู้ว่านี่เป็นด้ายเก่า แต่หวังว่าจะช่วยได้บ้าง

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 คืออะไร มันทำให้ฉันมีข้อผิดพลาด "ไม่มีอยู่"
ราหุล Khandelwal

6

ให้คำตอบอื่น ๆ ที่มีอายุไม่กี่ปีในขณะนี้ที่นี่ความคิดของฉันที่อาจเป็นประโยชน์:

วิธีที่ง่ายที่สุด

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
}

ตัวอย่างที่ใช้ประโยชน์ได้มากกว่า

บ่อยครั้งที่เรากำลังจัดการกับประเภทที่รู้จักและ JSON ดังนั้นคุณสามารถขยายแนวคิดนี้ด้วยการใช้งานจำนวนมากเช่น:

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
}

ตัวอย่างของสิ่งที่เรียกว่า:

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

5

คุณสามารถใช้บางอย่างเช่นรหัสหลอกนี้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.