【问题标题】:How can I send a POST request to a remote server?如何向远程服务器发送 POST 请求?
【发布时间】:2019-09-18 14:01:34
【问题描述】:

我的网站需要向远程服务器发布请求以使用其 API。

我在google中找到了一种使用HttpClient的方法,就像这样:

public async Task<string> HttpPostAsync(string uri, string url, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
    {

      string tokenUri = url;
      var client = new HttpClient();
      client.BaseAddress = new Uri(uri);
      HttpContent content = new FormUrlEncodedContent(formData);
      content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
      content.Headers.ContentType.CharSet = charset;
      for (int i = 0; i < formData.Count; i++)
      {
        content.Headers.Add(formData[i].Key, formData[i].Value);
      }

      HttpResponseMessage resp = await client.PostAsync(tokenUri, content);
      resp.EnsureSuccessStatusCode();
      string token = await resp.Content.ReadAsStringAsync();
      return token;
    }

这种方式可行,但示例来自 2017 年 .NET Core 1.1 刚刚发布。

现在 .NET Core 3.0 已经可用,不知道有没有其他更好的方法来实现这一点?

【问题讨论】:

    标签: c# asp.net-core .net-core


    【解决方案1】:

    HttpClient 仍然是在 .NET 中直接进行 HTTP 调用的最简单/最好的方法。对于总是发布表单内容的方法,可以稍微简化一下(不需要每次都指定媒体类型、字符集等):

    public static async Task<string> Post(string url, IEnumerable<KeyValuePair<string, string>> formData)
    {
        var client = new HttpClient();
        var formContent = new FormUrlEncodedContent(formData);
        var response = await client.PostAsync(url, formContent);
    
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
    
    var stringResponse = await Post("https://so57994582.free.beeceptor.com",
        new Dictionary<string, string>() { { "hello", "world" } });
    

    【讨论】:

    • 我认为在“返回等待响应...”中不需要等待
    • @John 这是必需的,因为ReadAsStringAsync 返回一个任务。
    • 是的:你的方法期望你返回一个 Task
    • 是的,但是方法被标记为async,这意味着如果方法返回string,编译器将自动返回Task&lt;string&gt;。如果删除最后一行的await,代码将无法编译。
    • @NateBarbettini - 我正在捡起你扔掉的东西。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多