如何使用 HttpClient 发布数据?

Posted

技术标签:

【中文标题】如何使用 HttpClient 发布数据?【英文标题】:How to post data using HttpClient? 【发布时间】:2013-11-15 16:05:55 【问题描述】:

我从 Nuget 获得了thisHttpClient。

当我想获取数据时,我会这样做:

var response = await httpClient.GetAsync(url);
var data = await response.Content.ReadAsStringAsync();

但问题是我不知道如何发布数据? 我必须发送一个发布请求并在其中发送这些值:comment="hello world"questionId = 1。这些可以是一个类的属性,我不知道。

更新我不知道如何将这些值添加到HttpContent,因为 post 方法需要它。 httClient.Post(string, HttpContent);

【问题讨论】:

你尝试过使用 Post 方法吗? 您应该遵循文档,了解您应该在帖子中发送哪些内容(如果您遵循 API)。然后,只需填写一个 HttpContent 并使用 PostAsync 你试过了吗? @Patrick 谢谢,我已经更新了我的问题 顺便说一句,在发布您的问题 10 分钟后发布 cmets “没有人帮忙吗?”笑脸可能不会鼓励其他溢出者更快地帮助你。如果您没有找到任何人回答您的问题,您可能希望查看您的问题,看看您可以做些什么来改进它,并提供有关您尝试过的更多信息,而不是期望其他人猜测您知道什么。 如果有人想使用 HttpClient 上传文件 - C# HttpClient 4.5 multipart/form-data upload 【参考方案1】:

你需要使用:

await client.PostAsync(uri, content);

类似的东西:

var comment = "hello world";
var questionId = 1;

var formContent = new FormUrlEncodedContent(new[]

    new KeyValuePair<string, string>("comment", comment), 
    new KeyValuePair<string, string>("questionId", questionId) 
);

var myHttpClient = new HttpClient();
var response = await myHttpClient.PostAsync(uri.ToString(), formContent);

如果您需要在发布后获得回复,您应该使用:

var stringContent = await response.Content.ReadAsStringAsync();

希望对你有帮助;)

【讨论】:

回复是Unprocessable entry。也许我在其他地方有错误 或更短的字典文字:var formContent = new FormUrlEncodedContent(new Dictionary&lt;string, string&gt; "comment", comment, "questionId", questionId ); 相关帖子 - POSTing JsonObject With HttpClient From Web API【参考方案2】:

尝试使用这个:

using (var handler = new HttpClientHandler()  CookieContainer = new CookieContainer() )

    using (var client = new HttpClient(handler)  BaseAddress = new Uri("site.com") )
    
        //add parameters on request
        var body = new List<KeyValuePair<string, string>>
        
            new KeyValuePair<string, string>("test", "test"),
            new KeyValuePair<string, string>("test1", "test1")
        ;

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "site.com");

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded; charset=UTF-8"));
        client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
        client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
        client.DefaultRequestHeaders.Add("X-MicrosoftAjax", "Delta=true");
        //client.DefaultRequestHeaders.Add("Accept", "*/*");

        client.Timeout = TimeSpan.FromMilliseconds(10000);

        var res = await client.PostAsync("", new FormUrlEncodedContent(body));

        if (res.IsSuccessStatusCode)
        
            var exec = await res.Content.ReadAsStringAsync();
            Console.WriteLine(exec);
                            
    

【讨论】:

您可能希望使用 MultipartFormDataContent 而不是 FormUrlEncodedContent(这取决于您的服务器的期望)【参考方案3】:

使用UploadStringAsync方法:

WebClient webClient = new WebClient();
webClient.UploadStringCompleted += (s, e) =>

    if (e.Error != null)
    
        //handle your error here
    
    else
    
        //post was successful, so do what you need to do here
    
;

webClient.UploadStringAsync(new Uri(yourUri), UriKind.Absolute), "POST", yourParameters);     

【讨论】:

谢谢,但我认为这个HttpClientWebClient 好。更容易和更清洁。不是吗? 啊,是的,我已经习惯了 WebClient,当我阅读这个问题时,我的脑海里就有了。到目前为止,我还没有使用过 HttpClient。对不起!

以上是关于如何使用 HttpClient 发布数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用HttpClient发布数据?

如何使用 HttpClient 将 JSON 数据发布到 Web API

如何使用 HttpClient 发布数据? (一个比实际有效的答案)

如何使用异步发布并使用 HttpClient 等待

如何使用 HttpClient 进行多线程操作?

如何在 C# 中使用 HttpClient 发送文件和表单数据