如何使用 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<string, string> "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);
【讨论】:
谢谢,但我认为这个HttpClient
比WebClient
好。更容易和更清洁。不是吗?
啊,是的,我已经习惯了 WebClient,当我阅读这个问题时,我的脑海里就有了。到目前为止,我还没有使用过 HttpClient。对不起!以上是关于如何使用 HttpClient 发布数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HttpClient 将 JSON 数据发布到 Web API