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

C#:带有 POST 参数的 HttpClient

带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段

C# HttpClient POST 请求

.Net(C#)后台发送Get和Post请求的几种方法总结

使用承载令牌在 C# 中构建 post HttpClient 请求