HttpClient向api发送空值,而不是查看json对象

Posted

技术标签:

【中文标题】HttpClient向api发送空值,而不是查看json对象【英文标题】:HttpClient sending null values to api, not looking at json object 【发布时间】:2021-12-19 01:40:54 【问题描述】:

我正在使用 ASP.NET 网站。我需要从表单中收集数据并将其发送到 api。 PostAsync() 需要两个参数,因此我必须将对象转换为 JSON 才能发送。这就是我的麻烦所在,因为 api 只接收空值。这是我正在查看的相关代码:

string apiurl = "http://localhost:5000/";

var content = new StringContent(JsonConvert.SerializeObject(formData), Encoding.UTF8, "application/json");

                using (var httpClient = new HttpClient())
                
                    using (var response = await httpClient.PostAsync($"apiurlapi/Contact/Create", content))
                    
                        await response.Content.ReadAsStringAsync();
                    
                

最后,我需要 api 来接收来自 formData 对象的值。但是它收到的值是空的。

我无法判断它是否正确转换为 JSON。 JsonConvert.SerializeObject(formData) 正在用我的数据准确地创建一个字符串,而 formData 对象本身就有我的值。但是当我检查内容变量时,我在任何地方都找不到该字符串。

这是 api 标头:

[HttpPost]
[Route("Create")]
public async Task<IActionResult> Create(string listId, string email, string firstName, string lastName)

我该怎么做:

1 - 验证 json 是否正确?

2 - 向 api 发送非空值?

编辑:

这里的要求是我制作的课程:

public class Report
    
        public string listId  get; set; 
        public string email  get; set; 
        public string firstName  get; set; 
        public string lastName  get; set;  
    

以及我是如何创建对象的:

Report formData = new Report 
                    listId = listId,
                    email = getFormValueFromKey(formModel.fieldNameValuePairs, "Email"),
                    firstName = "None",
                    lastName = "None"
                ;

【问题讨论】:

您也必须显示您的 Api 标头,请 [HttpPost] [Route("Create")] public async Task Create(string listId, string email, string firstName, string lastName) 【参考方案1】:

由于您使用的是表单数据,并且您的 API 参数看起来像键值对,我建议您尝试 application/x-www-form-urlencoded 内容类型

    var content = new FormUrlEncodedContent(formData);
    var response = await PostAsync($"apiurlapi/Contact/Create", content);
    if (response.IsSuccessStatusCode)
    
        var stringData = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<object>(stringData);
    

否则您将需要创建一个视图模型并使用 frombody 属性。

更新

很遗憾,我看不到您的表单数据。但是如果它不是键值对,你可以将它转换成字典,或者更好地发布它,以便我们推荐如何更好地使用它

var content = new FormUrlEncodedContent(
             new Dictionary<string, string>()
    

             "listId", formData.listId,
             "email", formData.email
    
    );

或者如果你想使用 json 然后创建视图模型

public class Report

  public string listId get; set;
   public string email get; set;
   .....

和api

[HttpPost]
[Route("Create")]
public async Task<IActionResult> Create([FromBody] Report model)

和代码

    var json = JsonConvert.SerializeObject(formdata);
    var content= new StringContent(json, Encoding.UTF8, "application/json");

【讨论】:

我试图实现这一点,但不得不将我的 formData 对象转换为 IEnumerable>,当它到达我的代码中的那个点时,转换失败了。 您应该显示您的表单数据。转换成字典更容易 我用我正在使用的课程和我输入的数据更新了我的问题 @Joe 我也更新了我的答案 所以 api 可以正常工作,最好不要改。如果必须,我可以,但是有没有办法让它像现在设置的那样与 api 一起工作?

以上是关于HttpClient向api发送空值,而不是查看json对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?

如何使用 HttpClient 将带有 JSON 的 DELETE 发送到 REST API

使用 HttpClient 和 RXJS 将数据发布到 Web API withCredentials: true

未通过 HttpClient 请求发送的授权标头

强制 mandrill API 发送邮件,而不是 django 与 smtp

为啥使用 HttpClient 而不是 HttpWebRequest 进行同步请求