C# - POST 请求中的正文内容

Posted

技术标签:

【中文标题】C# - POST 请求中的正文内容【英文标题】:C# - Body content in POST request 【发布时间】:2017-09-04 21:26:23 【问题描述】:

我需要在 C# 中进行一些 api 调用。我正在使用 Microsoft 的 Web API Client 来执行此操作。我成功发出了一些 POST 请求,但我不知道如何将“Body”字段添加到我的请求中。任何想法 ? 这是我的代码:

    static HttpClient client = new HttpClient();
    public override void AwakeFromNib()
    
        base.AwakeFromNib();
        notif_button.Activated += (sender, e) => 
        ;
        tips_button.Activated += (sender, e) =>
        
            Tip t1 = new Tip(title_tips.StringValue, pic_tips.StringValue, content_tips.StringValue, "TEST");
            client.BaseAddress = new Uri("my_url");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            CreateProductAsync(t1).Wait();
        ;
    

    static async Task<Uri> CreateProductAsync(Tip tips)
    
        HttpResponseMessage response = await client.PostAsJsonAsync("api/add_tips", tips);
        response.EnsureSuccessStatusCode();
        return response.Headers.Location;
    

【问题讨论】:

不要为您的问题添加答案,而是发布自我答案。 【参考方案1】:

步骤 1. 选择派生自 HttpContent 的类型。如果您想使用运行时代码编写大量内容,可以使用StreamContent 并在其上打开某种 StreamWriter。简而言之,请使用StringContent。您还可以为自定义内容派生自己的类。

步骤 2. 将调用中的内容传递给 HttpClient.PostAsync。

这是一个使用 StringContent 传递一些 JSON 的示例:

string json = JsonConvert.SerializeObject(someObject);
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
var httpResponse = await httpClient.PostAsync("http://www.foo.bar", httpContent);

另见How do I set up HttpContent?。

【讨论】:

感谢您的回答。我想我没有很好地理解。实际上,我将您的代码中的“someObject”替换为“tips”,但它仍然不起作用。你能解释一下或详细说明吗?我需要发布标题和正文。非常感谢【参考方案2】:

感谢this 和this,我终于找到了发送带有标题和正文内容的帖子请求的解决方案。代码如下:

        var cl = new HttpClient();
        cl.BaseAddress = new Uri("< YOUR URL >");
        int _TimeoutSec = 90;
        cl.Timeout = new TimeSpan(0, 0, _TimeoutSec);
        string _ContentType = "application/x-www-form-urlencoded";
        cl.DefaultRequestHeaders.Add(key, value);
        cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));
        cl.DefaultRequestHeaders.Add("key", "value");
        cl.DefaultRequestHeaders.Add("key", "value");
        var _UserAgent = "d-fens HttpClient";
        cl.DefaultRequestHeaders.Add("User-Agent", _UserAgent);

        var nvc = new List<KeyValuePair<string, string>>();
        nvc.Add(new KeyValuePair<string, string>("key of content", "value"));
        var req = new HttpRequestMessage(HttpMethod.Post, "http://www.t-lab.fr:3000/add_tips")  Content = new FormUrlEncodedContent(nvc) ;
        var res = cl.SendAsync(req);

【讨论】:

列表>();可以是字典 var payload = new Dictionary() "grant_type", GoogleAuthGrantType, "assertion", googleAuthJwt ;【参考方案3】:

比较容易理解

using (var client = new HttpClient())

    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
    client.DefaultRequestHeaders.Add("Accept", "*/*");

    var Parameters = new List<KeyValuePair<string, string>>
    
        new KeyValuePair<string, string>("Id", "1"),
    ;

    var Request = new HttpRequestMessage(HttpMethod.Post, "Post_Url")
    
        Content = new FormUrlEncodedContent(Parameters)
    ;

    var Result = client.SendAsync(Request).Result.Content.ReadAsStringAsync();

【讨论】:

以上是关于C# - POST 请求中的正文内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure 数据工厂的 Web 活动中为 POST 请求传递正文中的内容

如何使用 C# 在 POST 请求中发送 json 数据 [重复]

来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文

带有标头和原始 json 正文的 Volley POST 请求

如何在单元测试中验证Flurl Http中的请求正文内容?

如何将 json 列表传递给 Flutter 中的 http 请求(post)正文?