为什么更改控制器参数会引发http Post 404错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么更改控制器参数会引发http Post 404错误?相关的知识,希望对你有一定的参考价值。

我正在开发一个带有数据库的Azure Web应用程序。我有一个数据库的模型和控制器。我正在尝试在数据库上发布数据,但是在理解为什么在将数据从Web客户端发送到控制器时此代码发送404错误有些麻烦。

这是我在AngularJS中发送数据的方式(参数是Json字符串):

$http({
        method: 'post',
        url: serviceBasePath + "/api/suscribe",
        data: parameter,
        headers: { 'Content-Type': 'application/json' }
    }).then(function (response) {
        userService.SetCurrentUser(response.data);
        defer.resolve(response.data);
    }, function (error) {
        defer.reject(error.data);
    })

在控制器端,如果控制器是:我得到404:

[HttpPost]
[Route("api/suscribe")]
public IHttpActionResult PostGTW_Utilisateur(String JsonString)
{
    //
}

但如果我将模型作为参数,404错误就消失了:

[HttpPost]
[Route("api/suscribe")]
public IHttpActionResult PostGTW_Utilisateur(User u) 
{
    //
}

error 404 on post request with Json data Json对象类:

public class JsonSuscribeModel
{
    public Utilisateur user { get; set; }
    public string guid { get; set; }
    public string password2 { get; set; }
}
答案

你错过了端点,因为它不知道JsonString是什么。你发送了一个JSON但是在控制器模型中,你告诉它要监听字符串。打开Chrome(或其他)开发工具,然后查看您使用该请求发送的内容。

这是另一个提示:

$http({
        method: 'post',
        url: serviceBasePath + "/api/suscribe",
        data: parameter,
        headers: { 'Content-Type': 'application/json' }
    }).then(function (response) {
        userService.SetCurrentUser(response.data);
        defer.resolve(response.data);
    }, function (error) {
        defer.reject(error.data);
    })

我已多次看到滥用承诺的行为。你为什么要使用$ http(这本身就是一个承诺),然后在服务中处理它并返回另一个承诺?你可以简单地返回$ http(并在控制器中解决它的承诺。无论如何你将要解决这个新的承诺,所以为什么要有额外的步骤。

 return $http({
            method: 'post',
            url: serviceBasePath + "/api/suscribe",
            data: parameter,
            headers: { 'Content-Type': 'application/json' }
        }).then(function (response) {
            userService.SetCurrentUser(response.data);
            return response.data;
        }, function (error) {
            return error.data;
        })

这样您就可以返回整个$ http,并指示它返回成功和错误的内容。由于它本身是一个承诺,它将表现得像以前一样。

另一答案

谢谢你的提示。解决方案是使用我作为参数的JsonModel:

public IHttpActionResult PostGTW_Utilisateur(JsonSuscribeModel JsonModel)

以上是关于为什么更改控制器参数会引发http Post 404错误?的主要内容,如果未能解决你的问题,请参考以下文章

带有参数的 http POST 到 /session 引发的 Curl 错误:"desiredCapabilities":"browserName":"

POST/Redirect 引发“连接已重置”浏览器错误

更改 servlet 映射会引发“HTTP 状态 405 - 不支持请求方法 'GET'”

为啥未选择所有参数时 s-s-rS 公式会引发错误?

更改 Redshift 表的所有权会引发“必须是超级用户才能更改所有者”

更改 ajax 请求的 response.statuscode 会引发错误“发送 HTTP 标头后服务器无法设置状态”