C# HttpClient POST 请求
Posted
技术标签:
【中文标题】C# HttpClient POST 请求【英文标题】:C# HttpClient POST request 【发布时间】:2013-07-24 22:38:11 【问题描述】:我正在尝试创建一个 POST 请求,但无法正常工作。
这是请求的格式,有 3 个参数,accountidentifier / type / seriesid
http://someSite.com/api/User_Favorites.php?accountid=accountidentifier&type=type&seriesid=seriesid
这是我的 C#
using (var httpClient = new HttpClient())
httpClient.BaseAddress = new Uri("http://somesite.com");
var content = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("accountidentifier", accountID),
new KeyValuePair<string, string>("type", "add"),
new KeyValuePair<string, string>("seriesid", seriesId),
);
httpClient.PostAsync("/api/User_Favorites.php", content);
有什么想法吗?
【问题讨论】:
你能调试看看调用post时httpClient的完整uri是什么吗? 您提到的参数是URI
的一部分(查询部分,在?
之后),但您将它们发送为content
。
@Cubicle.Jockey 真的找不到。
@user1908061 该死的,你能给我一个使用参考什么的吗?
@allocator 嗯,HTTP 的***文章?真的没什么好说的。您请求 URI /api/User_Favorites.php
,但查询部分 (?accountid=...
) 也是您要请求的 URI 的一部分并且您将其省略。另一方面,您显然甚至不知道此 API 期望发送的内容是什么。你应该先弄清楚这一点,这是我们不可能知道的。
【参考方案1】:
IMO,C# 中的字典对于此类任务非常有用。 下面是一个完成精彩 POST 请求的异步方法示例:
public class YourFavoriteClassOfAllTime
//HttpClient should be instancied once and not be disposed
private static readonly HttpClient client = new HttpClient();
public async void Post()
var values = new Dictionary<string, string>
"accountidentifier", "Data you want to send at account field" ,
"type", "Data you want to send at type field",
"seriesid", "The data you went to send at seriesid field"
;
//form "postable object" if that makes any sense
var content = new FormUrlEncodedContent(values);
//POST the object to the specified URI
var response = await client.PostAsync("http://127.0.0.1/api/User_Favorites.php", content);
//Read back the answer from server
var responseString = await response.Content.ReadAsStringAsync();
【讨论】:
使用 .NET 6 并且在任何地方都找不到 FormUrlEncodedContent。根据文档,它应该在 System.Net.Http 中,但它不适合我。我安装了以命名空间命名的 nuget 包,它的描述甚至提到了该类,但它仍然不存在。 所以事实证明这是一个很多人都会发生的 IntelliSense 错误。我在 new 之后粘贴了类名,它确实检测到了它,只是由于某种原因它没有怀疑这个名称。【参考方案2】:你也可以试试 WebClient。它试图准确地模拟浏览器会做什么:
var uri = new Uri("http://whatever/");
WebClient client = new WebClient();
var collection = new Dictionary<string, string>();
collection.Add("accountID", accountID );
collection.Add("someKey", "someValue");
var s = client.UploadValuesAsync(uri, collection);
UploadValuesAsync 在哪里发布您的收藏。
【讨论】:
HttpClient 基本上是 WebClient 的新增强版,专为不断增长的调用 REST api 的需求而开发。 @user1908061 你应该尽量多帮忙,少发火。 @allocator 我没有发火。在这里,我刚刚提到较新的 HttpClient 类是为像您这样的情况设计的。在您的问题中,您在调用 API 时遇到问题,但您没有告诉我们是哪一个。你自己不知道如何正确称呼它.. 那么我们应该如何提供帮助呢?我指出了您问题中唯一明显的错误。 @user1908061 我将代码更改为pastebin.com/3GUUBUcV,但我仍然无法让它工作或决定应该发送哪些内容。这是 API 页面参考 thetvdb.com/wiki/index.php/API:User_Favorites @allocator 不幸的是,文档写得很糟糕。它没有提到你应该使用哪个 HTTP 动词。我会尝试使用GetAsync
而不是 PostAsync
看看你会得到什么。以上是关于C# HttpClient POST 请求的主要内容,如果未能解决你的问题,请参考以下文章
C#用HttpClient类post get,怎么设置cookies