【问题标题】:Web API 2 POST-request return nullWeb API 2 POST 请求返回 null
【发布时间】:2015-08-14 23:13:06
【问题描述】:

问题是,当输入方法时,“session”为空。如您所见,标头和​​ 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"

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,这工作!但如果你只有一个参数,它就可以工作。根据这种方式,您可以尝试转换 JSON 对象:类似于data: "\'" + data + "\'"。然后你在你的 WebAPI 方法中得到 [object Object](太神奇了)。
  • @shevchenko.ch 是的,这仅在您有一个参数时才有效,因为您只能从表单正文中检索一个基本类型值。如果您能给它一个赞成票,那就太好了。
  • 我会这样做,但没有足够的声誉(
  • 这个解决方案帮助了我。当您的 api 控制器接受一个字符串参数时,使用" 对其进行变形将确保其正常工作。但这仅适用于一个字符串参数场景。
【解决方案2】:

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

【讨论】:

  • 非常感谢,如果您有多个参数,这是最好的解决方案。
【解决方案3】:

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

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

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

即您的参数应该是这样的类的对象:

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

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 2017-11-07
    • 2020-03-21
    • 2022-01-04
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多