【问题标题】:Http Post is sending request with null bodyHttp Post 正在发送带有空正文的请求
【发布时间】:2019-03-15 17:42:32
【问题描述】:

我有一个 .NET API,如下所示

public List<long> Compare ([fromBody] String NumberOfDatasets)

我正在尝试从 Angular 应用程序访问 API。 GET 请求工作正常,但是当我尝试发送 POST 请求时,它没有正文,API 接收到一个空参数。

我通过从提琴手访问它检查了 API,它工作正常。 我也启用了

  • CORS
  • HttpPost
  • HttpOptions

对于 api。 我通过 Chrome 开发工具检查了标题也得到了正确添加。我在这里错过什么了吗?

我的angular app组件的TS文件如下:

myFunction()
{
   let httpHeaders = new HttpHeaders({
     'Content-Type' : 'application/json'
   });
   let options = {
     headers: httpHeaders
   };
   return this.httpClient.post(myUrl, "5", options);
}

【问题讨论】:

  • 我认为“5”不是有效的应用程序/json 内容。您是否尝试将请求正文设置为 { "NumberOfDatasets" : "5" }
  • 是的,我也试过了。也试过 JSON.Stringify({NumberOfDatasets : 5})
  • 你试过JSON.stringify("5")吗?

标签: c# .net angular asp.net-web-api


【解决方案1】:

当使用 application/json 的内容类型时将字符串作为正文发布是不可接受的,因为 json 将尝试从对象{} 或数组[] 解析。 要将单个字符串作为请求正文发送,请将内容类型更改为 application/x-www-form-urlencoded 并在字符串前面添加等号 (=)

试试这个方法

myFunction()
{
   let httpHeaders = new HttpHeaders({
     'Content-Type' : 'application/x-www-form-urlencoded'
   });
   let options = {
     headers: httpHeaders
   };
   return this.httpClient.post(myUrl, "=5", options);
}

【讨论】:

  • 这行得通。谢谢 :) 很抱歉迟到将其标记为答案
【解决方案2】:

"5" 不是有效的 JSON,因此 MVC 无法对其进行反序列化并返回 null。

将字符串作为JSON传递的正确方法是将其封装在引号中:

"\"5\"" //that's the way you should write it in JS

或使用

JSON.stringify("5")

这将为您提供您想要的任何对象的正确 JSON 字符串。

此外,传递{ NumberOfDatasets: "5" } 不起作用,因为它的正确反序列化对象必须如下所示:

public class DatasetsNumber
{
    public string NumberOfDatasets { get; set; }
}

这显然不是单独的字符串。

【讨论】:

  • 感谢您的回复。但遗憾的是我也试过了。另外据我所知,httpClient.post 可以接受任何类型的参数作为主体,该主体将被隐式转换为 JSON 对象
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多