.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를 만들고 Post정적 클래스 의 메서드에서 응답을 반환합니다 Http.

우리에게는이 쉬운 일이 남지 않았으므로 차선책은 무엇입니까?

데이터와 함께 HTTP POST를 보내고 응답 내용을 얻으려면 어떻게해야합니까?


이것은 실제로 완벽하게 나를 위해 ... 일 stickler.de/en/information/code-snippets/...
제이미 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의 답변은 그 시도를 따릅니다.
크리스 허친슨

9
이 예제는 실제로 원래의 질문에서 중요한 부분 인 응답을 읽지 않습니다!
Jon Watte

4
응답을 읽으려면을 수행하십시오 string result = System.Text.Encoding.UTF8.GetString(response). 이것이 내가 답을 찾은 질문입니다.
jporcenaluk

WebClient가 System.Net에 없으므로 Windows 8.1 용 Windows 스토어 앱을 빌드하려고하면이 방법이 더 이상 작동하지 않습니다. 대신 Ramesh의 답변을 사용하여 "await"의 사용법을 살펴보십시오.
Stephen Wylie 2016 년

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
Dictionary <String, String>과 함께 작동하여 더 깨끗합니다.
Peter Hedberg

23
최고의 답변 .. 오, 주님 감사합니다, 당신을 사랑합니다 감사합니다. 고군분투하고 있습니다. 2 FREAKNG WEEKS .. 당신은 내 모든 게시물을 볼 수 있습니다. 늦게 작동, YEHAAA <허그>
Jimmyt1988

1
가능하면 호출 .Result과 함께 사용해서는 안됩니다 . UI 스레드가 차단되지 않도록하십시오. 또한 간단한 목록뿐만 아니라 작동합니다; 사전은 코드를 정리하지만 일부 HTTP 기능은 줄입니다. Asyncawaitnew[]
Matt DeKrey

1
요즘 (2016)이 최선의 대답입니다. HttpClient는 WebClient (가장 많이 투표 된 답변)보다 새롭고 몇 가지 장점이 있습니다. 1) 기본적으로 HTTP의 발명자 중 하나 인 Henrik F Nielson이 작업중인 우수한 비동기 프로그래밍 모델이 있으며 API를 설계했습니다. HTTP 표준을 따르는 것이 쉽습니다. 2) .Net 프레임 워크 4.5에서 지원되므로, 장래의 미래에 대한 지원 수준이 보장됩니다. 3) .Net 4.0, Windows Phone 등의 다른 플랫폼에서 사용하려는 경우 xcopyable / portable-framework 버전의 라이브러리도 있습니다.
Luis Gouveia

httpclient로 파일을 보내는 방법
Darshan Dave

47

WebRequest를 사용하십시오 . 에서 스콧 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 란 무엇입니까? "존재하지 않습니다"라는 오류가 발생합니다.
Rahul 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.