Http Post发送带有空正文的请求

时间:2018-10-10 18:21:50

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

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

myApp.service("lastday_data", function($http) {
  this.getData = function() {
    return $http({
      method: 'GET',
      url: 'http://localhost/task/index.php/v1/example/users'
    }).then(function(response) {
      if (response.status)
        return response.data;
      else
        return $q.reject('Problem retrieving data');
    }, function(error) {
      return $q.reject(error);
    });
  }
});

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

我已经通过提琴手访问该API进行了检查,并且工作正常。 我也启用了

  • CORS
  • HttpPost
  • HttpOptions

用于api。 标题也被正确添加,我通过Chrome开发工具进行了检查。我在这里想念什么吗?

我的角度应用程序组件的TS文件如下:

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

2 个答案:

答案 0 :(得分:2)

使用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);
}

答案 1 :(得分:1)

"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; }
}

显然不是一个字符串。