为什么更改控制器参数会引发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)
{
//
}
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":"
更改 servlet 映射会引发“HTTP 状态 405 - 不支持请求方法 'GET'”