【问题标题】:Angular Post json to .net core web api is nullAngular Post json 到 .net core web api 为空
【发布时间】:2018-01-24 22:03:15
【问题描述】:

我正在尝试将一些 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 发布的方式(请注意已加载相应的服务)

    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`, issue, {
        headers: headers
      }).toPromise()
        .then(res => {
          console.log(res.json());
        });
    });
  }

我已尝试将帖子更改为

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

甚至

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

但似乎没有任何效果有人知道为什么会这样吗? 澄清在 API 上收到的string issue 始终为空。 这是我到达服务器时的成功响应,您可以看到请求有效负载不为空,但到达 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);
    }

以及我的Angular项目传递一个类似的格式体

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 框架而不适用于 .net 核心?

【问题讨论】:

  • 你在PostIssues()返回什么?你的 JS 中issue 的值是多少?
  • 我返回 Ok(去序列化问题),但我不明白为什么这会是一个问题,问题是我发布的 json 在 api 上被接收为 null
  • 啊好吧 - 我以为你的意思是 res.json() 是空的。您的客户请求是什么样的(来自 Fiddler 或开发工具)?
  • 我已按照您的要求发布了客户请求
  • 我相信您的请求正文需要 issue 属性。您是否尝试将其添加到请求正文中?

标签: c# angular asp.net-core asp.net-core-webapi


【解决方案1】:

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

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

将 JSON 传递给 this 总是会给你一个 null,因为你试图绑定到一个原始数据类型。要解决此问题,您有两个选择

绑定到模型(视图模型)

当您的参数是一个类时,asp 会将这个类绑定到您传递的 json 数据,这就是您能够获取name 数据的原因。 根据您的更新,您可能会走这条路。

更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

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

使用FormData传递数据

你需要像这样改变你的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());
        });
    });
  }

希望这会有所帮助。

【讨论】:

  • 谢谢,这是有道理的,涵盖我将标记为正确。
【解决方案2】:

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

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

【讨论】:

  • 我想避免这种情况,因为那里可能有几个长字符串,根据过去的经验,如果长度超过一定大小,可能会导致很多问题。
  • 基于一个类似的问题,我认为你必须添加这个标题:{'Content-Type': 'application/x-www-form-urlencoded'} stackoverflow.com/questions/45719017/…
  • 如果我这样做我会得到一个 415 错误,如果我将它保留为 application/json 它会到达 api 但为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2019-05-13
相关资源
最近更新 更多