C# - POST请求中的Body内容
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 TaskCreateProductAsync(Tip tips) { HttpResponseMessage response = await client.PostAsJsonAsync("api/add_tips", tips); response.EnsureSuccessStatusCode(); return response.Headers.Location; }
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
var payload = new Dictionary() { {"grant_type", GoogleAuthGrantType}, {"assertion", googleAuthJwt} };
这样,就可以在发送POST请求时同时发送请求头和请求体内容。
在上述代码中,我们可以看到一个使用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请求的主体内容就会包含所有参数的正确值。
问题的原因是用户试图使用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。
希望以上解决方法对您有帮助。如果有任何疑问,请随时提问。