网站 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
}