.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からの回答がその試みの後に続きます。
Chris Hutchinson、

9
この例は、実際には応答を読み取っていません。これは、元の質問の重要な部分でした!
Jon Watte 2013

4
応答を読むには、次のようにしますstring result = System.Text.Encoding.UTF8.GetString(response)これが私が答えを見つけた質問です。
jporcenaluk 14年

System.NetにWebClientが見つからないため、Windows 8.1用のWindowsストアアプリを構築しようとしている場合、このメソッドは機能しなくなります。代わりに、Rameshの回答を使用して、「待機」の使用法を調べてください。
スティーブンワイリー2014年

2
私はこれをプラス1するつもりですが、あなたの回答を改善するために、回答を読むことについての@jporcenalukコメントを含める必要があります。
Corgalore 2014

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 2013年

23
BEST ANSWER EVER ..ああ、領主に感謝し、愛してくれてありがとう。私は苦労してきました.. 2フリークウィーク..すべての私の投稿を表示する必要があります。ARGHH ITS WORKING、YEHAAA <hugs>
Jimmyt1988

1
可能であれば、呼び出しでは使用.Resultしないでください。UIスレッドがブロックされないようにするためにAsync使用awaitします。また、シンプルnew[]はリストと同様に機能します。辞書はコードをクリーンアップしますが、一部のHTTP機能を削減します。
Matt DeKrey 2014

1
今日(2016)これが最良の答えです。HttpClientはWebClient(最も投票数の多い回答)よりも新しく、いくつかの利点があります。1)基本的にHTTPの発明者の1人であるHenrik F Nielsonが取り組んでいる優れた非同期プログラミングモデルがあり、APIを設計したHTTP標準に準拠するのは簡単です。2).Netフレームワーク4.5でサポートされているため、当面のサポートはある程度保証されています。あなたが他のプラットフォーム上でそれを使用したい場合3)また、ライブラリのxcopyable /ポータブル・フレームワークのバージョンを持っている- .NET 4.0、Windowsの携帯電話等...
ルイス・Gouveiaの

httpclientでファイルを送信する方法
Darshan Dave

47

WebRequestを使用しますスコット・ハンセルマンから:

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()もおそらく機能し、もう1つのレベルを抽象化します。

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 2016

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.