C# 从json到.net核心web api的Angular Post为空
我试图将一些JSON发布到web api.net核心,但由于某些原因,无论我尝试了什么,这总是空的。请参阅下面的代码 这是我的.net核心web api代码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 {
[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());
});
});
}