C#でWebClientを使用して特定のURLにデータを投稿する方法


319

WebClientで「HTTP Post」を使用して、特定のURLにデータを投稿する必要があります。

今、これはWebRequestで実現できることはわかっていますが、いくつかの理由で代わりにWebClientを使用したいと思います。それは可能ですか?もしそうなら、誰かが私にいくつかの例を示すか、私を正しい方向に向けることができますか?

回答:


374

私は解決策を見つけただけで、思ったより簡単でした:)

だからここに解決策があります:

string URI = "http://www.myurl.com/post.php";
string myParameters = "param1=value1&param2=value2&param3=value3";

using (WebClient wc = new WebClient())
{
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string HtmlResult = wc.UploadString(URI, myParameters);
}

それは魅力のように機能します:)


28
nitpick:HttpRequestHeader.ContentTypeこのように、ここで列挙型メンバーを使用することをお勧めしますweb.Headers[HttpRequestHeader.ContentType]:p
Alex

12
別のひっくり返して、.disposeまたは "using"イディオムを使用してWebクライアントを適切に破棄する必要があります:using(WebClient wc = new WebClient()){//ここのコード}
Mikey Hogarth

1
@RobinVanPersi ShikataGanai(Rafik bari)は、他の回答(stackoverflow.com/a/13061805/1160796)がエンコーディングを処理するのでより良いことを意味すると思います。
バッシャー2014

3
@ alpsystems.com IDisposableオブジェクトは、using内でラップするか、.Dispose()を明示的に呼び出すことにより、プログラマーが適切に破棄する必要があります。ガベージコレクターは、ファイルハンドラー、データベース接続などのアンマネージリソースを追跡できません
ccalboni

1
@ccalboniの説明を拡張する。場合によっては、ガベージコレクターは、デストラクターを呼び出すことにより、アンマネージリソースなどをクリーンアップします(たとえば、を含むをWebClient継承しComponentます~Component() {Dispose(false);})。問題は、ガベージコレクターがコレクションの決定を行うときに管理されていないリソースを考慮しないため、ガベージコレクターが任意の長い時間かかる可能性があることです。価値の高いリソースは、できるだけ早くクリーンアップする必要があります。たとえば、不要なファイルハンドルを開いたままにすると、ファイルが削除されたり他のコードによって書き込まれたりするのをブロックできます。
ブライアン

361

UploadValuesと呼ばれる組み込みメソッドがあり、HTTP POST(または任意の種類のHTTPメソッド)を送信でき、リクエストボディ(「&」を含むパラメーターを連結し、URLエンコーディングで文字をエスケープする)を適切な形式のデータ形式で処理します。

using(WebClient client = new WebClient())
{
    var reqparm = new System.Collections.Specialized.NameValueCollection();
    reqparm.Add("param1", "<any> kinds & of = ? strings");
    reqparm.Add("param2", "escaping is already handled");
    byte[] responsebytes = client.UploadValues("http://localhost", "POST", reqparm);
    string responsebody = Encoding.UTF8.GetString(responsebytes);
}

1
モデルをコントローラーに投稿したい場合はどうなりますか?それでもreqparm.Add(string、string)を使用できますか?
BurakKarakuş15年

6
@BurakKarakuşボディでJSONを送信したいですか?次に、WebClient.UploadStringを使用することができます。ヘッダーにContent-Type:application / jsonを追加することを忘れないでください。
Endy Tjahjono、2015

@EndyTjahjono:ラジオボタンの値を投稿するにはどうすればよいですか。同じグループに属する3つのラジオボタンがあるとします。
Asad Refai 2015

応答コードを取得するにはどうすればよいですか?応答ヘッダー?応答を解析する必要がありますか?それを行う簡単な方法はありますか?
Jay Sullivan、

警告。namevalueCollection donestは同じキーを許可します。したがって、奇妙なbegaiviourを引き起こす可能性があります
bh_earth0

40

を使用するWebClient.UploadStringWebClient.UploadData、サーバーにデータを簡単にPOSTできます。UploadStringはDownloadStringと同じ方法で使用されるため、UploadDataを使用した例を示します。

byte[] bret = client.UploadData("http://www.website.com/post.php", "POST",
                System.Text.Encoding.ASCII.GetBytes("field1=value1&amp;field2=value2") );

            string sret = System.Text.Encoding.ASCII.GetString(bret);

詳細:http : //www.daveamenta.com/2008-05/c-webclient-usage/


5
使用するのが良い:client.Encoding = System.Text.UTF8Encoding.UTF8; string varValue = Uri.EscapeDataString(value);
Yuriy Vikulov

23
string URI = "site.com/mail.php";
using (WebClient client = new WebClient())
{
    System.Collections.Specialized.NameValueCollection postData = 
        new System.Collections.Specialized.NameValueCollection()
       {
              { "to", emailTo },  
              { "subject", currentSubject },
              { "body", currentBody }
       };
    string pagesource = Encoding.UTF8.GetString(client.UploadValues(URI, postData));
}

21
//Making a POST request using WebClient.
Function()
{    
  WebClient wc = new WebClient();

  var URI = new Uri("http://your_uri_goes_here");

  //If any encoding is needed.
  wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
  //Or any other encoding type.

  //If any key needed

  wc.Headers["KEY"] = "Your_Key_Goes_Here";

  wc.UploadStringCompleted += 
      new UploadStringCompletedEventHandler(wc_UploadStringCompleted);

  wc.UploadStringAsync(URI,"POST","Data_To_Be_sent");    
}

void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)    
{  
  try            
  {          
     MessageBox.Show(e.Result); 
     //e.result fetches you the response against your POST request.         
  }
  catch(Exception exc)         
  {             
     MessageBox.Show(exc.ToString());            
  }
}

非同期バージョンの使用は、上記のすべてが実行をポストしてブロックするのに適しています。
フアン

ダブル__を削除してwc__UploadStringCompletedを修正します
Joel Davis

1
上記のすべての回答はテストで問題なく機能しますが、インターネットが貧弱な現実の状況では、これがより良い回答です。
Joel Davis

2

client.UploadString(adress, content);通常、simpleの使用は問題なく機能しますがWebException、HTTP成功ステータスコードが返されない場合はがスローされることに注意してください。私は通常、次のように処理して、リモートサーバーが返す例外メッセージを出力します。

try
{
    postResult = client.UploadString(address, content);
}
catch (WebException ex)
{
    String responseFromServer = ex.Message.ToString() + " ";
    if (ex.Response != null)
    {
        using (WebResponse response = ex.Response)
        {
            Stream dataRs = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataRs))
            {
                responseFromServer += reader.ReadToEnd();
                _log.Error("Server Response: " + responseFromServer);
            }
        }
    }
    throw;
}

ありがとう、オグラス。エラーを見つけるのに多くの時間を費やしましたが、あなたのコードは修正するためのより多くの情報を提供してくれます。
ケイト

1

モデルでwebapiclientを使用すると、シリアル化jsonパラメーター要求が送信されます。

PostModel.cs

    public string Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }

WebApiClient.cs

internal class WebApiClient  : IDisposable
  {

    private bool _isDispose;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!_isDispose)
        {

            if (disposing)
            {

            }
        }

        _isDispose = true;
    }

    private void SetHeaderParameters(WebClient client)
    {
        client.Headers.Clear();
        client.Headers.Add("Content-Type", "application/json");
        client.Encoding = Encoding.UTF8;
    }

    public async Task<T> PostJsonWithModelAsync<T>(string address, string data,)
    {
        using (var client = new WebClient())
        {
            SetHeaderParameters(client);
            string result = await client.UploadStringTaskAsync(address, data); //  method:
    //The HTTP method used to send the file to the resource. If null, the default is  POST 
            return JsonConvert.DeserializeObject<T>(result);
        }
    }
}

ビジネス呼び出し元メソッド

    public async Task<ResultDTO> GetResultAsync(PostModel model)
    {
        try
        {
            using (var client = new WebApiClient())
            {
                var serializeModel= JsonConvert.SerializeObject(model);// using Newtonsoft.Json;
                var response = await client.PostJsonWithModelAsync<ResultDTO>("http://www.website.com/api/create", serializeModel);
                return response;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }

0

ここに明確な答えがあります:

public String sendSMS(String phone, String token) {
    WebClient webClient = WebClient.create(smsServiceUrl);

    SMSRequest smsRequest = new SMSRequest();
    smsRequest.setMessage(token);
    smsRequest.setPhoneNo(phone);
    smsRequest.setTokenId(smsServiceTokenId);

    Mono<String> response = webClient.post()
          .uri(smsServiceEndpoint)
          .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .body(Mono.just(smsRequest), SMSRequest.class)
          .retrieve().bodyToMono(String.class);

    String deliveryResponse = response.block();
    if (deliveryResponse.equalsIgnoreCase("success")) {
      return deliveryResponse;
    }
    return null;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.