网站 API 2 POST-request return 空
Web API 2 POST-request return null
问题是,当输入方法时,"session"是一个空值。如您所见,headers 和 JSON-object 是正确的。你能告诉我我做错了什么吗?
我的 POST-request 和 angular:
$scope.send = function () {
var data = { "session": session };
var req = {
method: 'POST',
data: data,
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
$http(req).success(
function () {
quiz();
});
}
和C#代码:
[Route("answers")]
[HttpPost]
public IActionResult AnswerPost([FromBody] string session) {
...
}
Chrome 控制台:
Request URL:http://localhost:39634/api/myquiz/answers/
Request Headers
Provisional headers are shown
Accept:application/json, text/plain, */*
Content-Type:application/json
Origin:http://localhost:39634
Referer:http://localhost:39634/Team/Index
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Request Payload
{session: "92dfb7e432224702a553c98c294b29cf"}
session: "92dfb7e432224702a553c98c294b29cf"
Per Web API documentation,尝试直接发送会话(原始 json 字符串)而不是将其放入字典(json 对象)。
var req = {
method: 'POST',
data: '"' + session + '"',
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
您正在向 WebApi 发布对象:
var data = { "session": session };
这就是说您正在传递一个具有会话 属性 的对象。你告诉你的 WebApi 方法期望的是一个字符串:
public IActionResult AnswerPost([FromBody] string session)
不是对象。
我认为如果您将代码更改为:
$scope.send = function () {
//var data = { "session": session };
var req = {
method: 'POST',
data: session,
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
$http(req).success(
function () {
quiz();
});
}
应该可以。希望这可以帮助。不过,如果您将来要将更多参数传递给该函数,我会创建一个 C# 对象以传递给控制器。像这样:
public class AnswerPost
{
public string Session {get; set;}
}
然后将控制器方法更新为如下所示:
[Route("answers")]
[HttpPost]
public IActionResult AnswerPost([FromBody] AnswerPost answerpost) {
...
}
Web API 操作需要一个与参数类型匹配的值才能反序列化正文。
因此,如果您的 Web API 参数是一个值类型,例如您的 string session
,您必须 post 一个单一值,例如 'my string'
,没有额外的包装纸。
如果您的 Web API 参数是一个复杂的参数,例如带有属性的 class,那么您将不得不 post 一个 JSON 对象,就像您一样做你的问题。
即您的参数应该是 class 的对象,如下所示:
public class ParamClass
{
public string session { get; set; } // Note: it's case.sensitive
}
问题是,当输入方法时,"session"是一个空值。如您所见,headers 和 JSON-object 是正确的。你能告诉我我做错了什么吗?
我的 POST-request 和 angular:
$scope.send = function () {
var data = { "session": session };
var req = {
method: 'POST',
data: data,
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
$http(req).success(
function () {
quiz();
});
}
和C#代码:
[Route("answers")]
[HttpPost]
public IActionResult AnswerPost([FromBody] string session) {
...
}
Chrome 控制台:
Request URL:http://localhost:39634/api/myquiz/answers/
Request Headers
Provisional headers are shown
Accept:application/json, text/plain, */*
Content-Type:application/json
Origin:http://localhost:39634
Referer:http://localhost:39634/Team/Index
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Request Payload
{session: "92dfb7e432224702a553c98c294b29cf"}
session: "92dfb7e432224702a553c98c294b29cf"
Per Web API documentation,尝试直接发送会话(原始 json 字符串)而不是将其放入字典(json 对象)。
var req = {
method: 'POST',
data: '"' + session + '"',
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
您正在向 WebApi 发布对象:
var data = { "session": session };
这就是说您正在传递一个具有会话 属性 的对象。你告诉你的 WebApi 方法期望的是一个字符串:
public IActionResult AnswerPost([FromBody] string session)
不是对象。 我认为如果您将代码更改为:
$scope.send = function () {
//var data = { "session": session };
var req = {
method: 'POST',
data: session,
headers: {'Content-Type': 'application/json'},
url: '/api/myquiz/answers/'
}
$http(req).success(
function () {
quiz();
});
}
应该可以。希望这可以帮助。不过,如果您将来要将更多参数传递给该函数,我会创建一个 C# 对象以传递给控制器。像这样:
public class AnswerPost
{
public string Session {get; set;}
}
然后将控制器方法更新为如下所示:
[Route("answers")]
[HttpPost]
public IActionResult AnswerPost([FromBody] AnswerPost answerpost) {
...
}
Web API 操作需要一个与参数类型匹配的值才能反序列化正文。
因此,如果您的 Web API 参数是一个值类型,例如您的 string session
,您必须 post 一个单一值,例如 'my string'
,没有额外的包装纸。
如果您的 Web API 参数是一个复杂的参数,例如带有属性的 class,那么您将不得不 post 一个 JSON 对象,就像您一样做你的问题。
即您的参数应该是 class 的对象,如下所示:
public class ParamClass
{
public string session { get; set; } // Note: it's case.sensitive
}