如何使用HttpClient发布数据?


68

我从Nuget获得了这个HttpClient。

当我想获取数据时,可以这样:

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

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

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


您是否尝试使用Post方法?
Patrick

您应该按照文档中的规定发送帖子中的内容(如果您使用的是API)。然后,只需填写HttpContent并使用PostAsync,您是否尝试过?
Patrick

@Patrick谢谢,我已经更新了我的问题
user2970840 2013年

4
顺便说一句,在发表您的问题10分钟后,发表评论“没有人可以帮助吗?” 笑脸可能不会鼓励其他溢出者更快地帮助您。如果找不到任何人回答您的问题,则可能需要查看您的问题,看看可以做些什么来改进它,同时提供有关您尝试过的内容的更多信息,而不是期望其他人猜测您知道的事情。
Patrick

1
如果有人希望使用HttpClient上传文件-C#HttpClient 4.5分段/表单数据上传
RBT

Answers:


154

您需要使用:

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。也许我在其他地方有一个错误
2013年

11
或更短的字典文字:var formContent = new FormUrlEncodedContent(new Dictionary<string, string> { {"comment", comment}, {"questionId", questionId } });
hkarask

4

尝试使用此:

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);
        }                    
    }
}

-2

使用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);     

4
谢谢,但是我认为这HttpClient比更好WebClient。更轻松,更清洁。是不是
user2970840

嗯,是的,我已经习惯了WebClient,当我阅读问题时,我已经想到了这一点。到目前为止,我还没有使用过HttpClient。抱歉!
罗里·拉隆德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.