Web API 2 POST请求返回null

时间:2015-06-01 13:10:32

标签: c# angularjs asp.net-web-api2

问题是,当输入方法时,"会话"是null。如您所见,标头和​​JSON对象是正确的。你能告诉我我做错了吗?

我的带角度的POST请求

        $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"




3 个答案:

答案 0 :(得分:1)

根据Web API documentation,尝试直接发送会话(原始json字符串),而不是将其放在dictinary(json对象)中。

var req = {
    method: 'POST',
    data: '"' + session + '"',
    headers: {'Content-Type': 'application/json'},
    url: '/api/myquiz/answers/'
}

答案 1 :(得分:1)

您正在向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) {
...
}

答案 2 :(得分:1)

Web API操作需要与参数类型匹配的值才能反序列化正文。

因此,如果您的Web API参数是值类型,例如string session,则必须发布单个值,例如'my string',而不需要额外的包装。

如果您的Web API参数是一个复杂的参数,例如具有属性的类,那么您必须发布一个JSON对象,就像您在问题中所做的那样。

即。你的参数应该是这样一个类的对象:

public class ParamClass
{
   public string session { get; set; } // Note: it's case.sensitive
}