C# - POST请求中的Body内容

13 浏览
0 Comments

C# - POST请求中的Body内容

我需要在C#中进行一些API调用。我正在使用微软的Web API客户端来完成这个任务。我成功地发出了一些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 CreateProductAsync(Tip tips)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync("api/add_tips", tips);
        response.EnsureSuccessStatusCode();
        return response.Headers.Location;
    }

0
0 Comments

C# - 发送POST请求中的Body内容

在使用C#发送POST请求时,有时需要同时发送请求头和请求体内容。下面的代码是一种解决方案:

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

需要注意的是,`List>()` 可以替换为 `Dictionary`,示例如下:

var payload = new Dictionary()
{
    {"grant_type", GoogleAuthGrantType},
    {"assertion", googleAuthJwt}
};

这样,就可以在发送POST请求时同时发送请求头和请求体内容。

0
0 Comments

在上述代码中,我们可以看到一个使用C#编写的POST请求。然而,这段代码中出现了一个问题,即在请求的主体内容(Body content)中没有正确地设置参数。

出现这个问题的原因是在创建`FormUrlEncodedContent`对象时,未正确设置参数列表。具体来说,在`Parameters`列表中只包含了一个键值对,即`Id=1`。然而,在实际应用中,我们可能需要传递更多的参数。

要解决这个问题,我们需要在`Parameters`列表中添加更多的键值对,以传递所有需要的参数。可以按照以下方式修改代码:

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"),
        new KeyValuePair<string, string>("Name", "John"),
        new KeyValuePair<string, string>("Age", "25"),
        // 添加更多参数...
    };
    var Request = new HttpRequestMessage(HttpMethod.Post, "Post_Url")
    {
        Content = new FormUrlEncodedContent(Parameters)
    };
    var Result = client.SendAsync(Request).Result.Content.ReadAsStringAsync();
}

通过添加更多的键值对,我们现在可以正确地传递所有需要的参数。这样,POST请求的主体内容就会包含所有参数的正确值。

0
0 Comments

问题的原因是用户试图使用HttpClient.PostAsync方法发送一个带有headers和body内容的POST请求,但是没有正确设置HttpContent。

解决方法是根据用户的需求选择合适的HttpContent派生类,并将其作为参数传递给HttpClient.PostAsync方法。

在这个例子中,用户可以使用StringContent类来传递JSON数据。首先,将需要发送的数据序列化为JSON字符串,然后使用StringContent类将其包装起来。示例代码如下:

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

上述代码将tips对象序列化为JSON字符串,并使用StringContent类进行包装。其中,Encoding.UTF8表示使用UTF-8编码,"application/json"表示内容的媒体类型为JSON。

希望以上解决方法对您有帮助。如果有任何疑问,请随时提问。

0