Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从json到.net核心web api的Angular Post为空_C#_Angular_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# 从json到.net核心web api的Angular Post为空

C# 从json到.net核心web api的Angular Post为空,c#,angular,asp.net-core,asp.net-core-webapi,C#,Angular,Asp.net Core,Asp.net Core Webapi,我试图将一些JSON发布到web api.net核心,但由于某些原因,无论我尝试了什么,这总是空的。请参阅下面的代码 这是我的.net核心web api代码 [Produces("application/json")] [Route("api/v1/Issues")] [Authorize] [EnableCors("AllowCors")] public class IssuesController : Controller {

我试图将一些JSON发布到web api.net核心,但由于某些原因,无论我尝试了什么,这总是空的。请参阅下面的代码

这是我的.net核心web api代码

    [Produces("application/json")]
    [Route("api/v1/Issues")]
    [Authorize]
    [EnableCors("AllowCors")]
    public class IssuesController : Controller
    {
        [HttpPost]
        public IActionResult PostIssues([FromBody] string issue)
        {
          //some code to desirialize
        }
    }
这就是我试图通过angular发布的方式(请注意,已加载相应的服务)

我试着把帖子改成

this.http.post(`${this.baseUrl}/v1/issues`, JSON.stringify(issue))
甚至

this.http.post(`${this.baseUrl}/v1/issues`, {'issue', JSON.stringify(issue)})
但似乎什么都不管用谁知道为什么会这样? 为了澄清API上收到的
字符串问题
,它始终为空。 下面是当我到达服务器时的成功响应,您可以看到请求负载不是null,而是作为null到达web api

如有可能,请更新1条说明 好的,我想做一个小实验,同样的代码在4.5框架下运行良好,而不是在.net内核上运行,但是我尝试在.net内核上运行的是创建一个名为foo的类,请参见下文

public class Foo
    {
        public string Name { get; set; }
        public string Json { get; set; }
    }
并修改我的控制器以接受此对象

   [HttpPost]
    public IActionResult PostIssues([FromBody] Foo issue)
    {
       Debug.Write(issue);
       return Ok(issue);
    }
以及我的角度项目,以通过类似的格式机构

public addIssue(issue) {
const headers = new Headers();
this.authService.getToken().toPromise().then( t => {

  headers.append('Authorization', `Bearer ${t.toString()}`);
  headers.append('Content-Type', 'application/json');

  this.http.post(`${this.baseUrl}/v1/issues`, {'name' : 'name', 'json': JSON.stringify(issue)}, {
    headers: headers,
    withCredentials: true
  }).toPromise()
    .then(res => {
      console.log(res.json());
    });
});
}

这将成功地通过并绑定到控制器


为什么这样可以,但不能直接传递Json?为什么我的原始代码可以在4.5 framework上运行,而不能在.net core上运行?

因为它是一个字符串,您可以在url中传递它

${this.baseUrl}/v1/issues?issue=yourVarIssue

我会尽力回答你所有的问题

API上收到的字符串问题始终为空

将JSON传递给它总是会得到null,因为您正试图绑定到一个基本数据类型。要解决这个问题,你有两个选择

绑定到模型(viewmodel)

当您的参数是一个类时,asp将把这个类绑定到您传递的json数据,这就是为什么您能够获得
名称
数据。 根据您的更新,您可能会走这条路线

更多信息:

现在您可能想知道,当参数只是一个字符串时,为什么要创建一个仅用于api的类?!如果只想在api中使用
字符串
,则可以这样做

使用
表单数据传递数据

您需要像这样更改api

 public IActionResult PostIssues(string issue){..}
您不需要在此处指定
[FromBody]

在客户端

 public addIssue(issue) {
    const headers = new Headers();
    this.authService.getToken().toPromise().then( t => {
      headers.append('Authorization', `Bearer ${t.toString()}`);
     // new code here
    var formData = new FormData();
    formData.append('issue',issue); //you need to specify the parameter name here.
      this.http.post(`${this.baseUrl}/v1/issues`, formData, {
        headers: headers
      }).toPromise()
        .then(res => {
          console.log(res.json());
        });
    });
  }

希望这有帮助。

postsissues()中返回的内容是什么?
?在你的JS中,
issue
的值是什么?我返回Ok(非一般化的问题),但我不明白为什么会有这样的问题。问题是我发布的json在apiAh上被接收为null Ok-我以为你的意思是
res.json()
为null。您的客户端请求看起来像什么(来自Fiddler或dev tools)?我已经根据您的请求发布了客户端请求。我相信您的请求主体需要一个
问题
属性。您是否尝试将其添加到请求正文中?我希望避免这种情况,因为其中可能有两个长字符串,并且根据过去的经验,如果长度超过一定的大小,可能会导致很多问题。基于类似的问题,我认为您必须添加以下标题:{'Content-Type':'application/x-www-form-urlencoded'}如果我这样做,我会得到一个415错误,如果我把它作为application/json,它会到达api,但这是有意义的,覆盖我的部分会标记为正确。
 public addIssue(issue) {
    const headers = new Headers();
    this.authService.getToken().toPromise().then( t => {
      headers.append('Authorization', `Bearer ${t.toString()}`);
     // new code here
    var formData = new FormData();
    formData.append('issue',issue); //you need to specify the parameter name here.
      this.http.post(`${this.baseUrl}/v1/issues`, formData, {
        headers: headers
      }).toPromise()
        .then(res => {
          console.log(res.json());
        });
    });
  }