【问题标题】:HttpClient sending null values to api, not looking at json objectHttpClient向api发送空值,而不是查看json对象
【发布时间】: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($"{apiurl}api/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)

标签: c# asp.net json api umbraco


【解决方案1】:

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

    var content = new FormUrlEncodedContent(formData);
    var response = await PostAsync($"{apiurl}api/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 一起工作?
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多