我之前发布了一篇类似的帖子并得到了一些很好的答案,但我不小心删除了我的帖子,所以我发布的修订版本包含更多数据。
我正在构建一个Web API来发布并从我的视图中获取数据。与API通信效果很好,但我遇到了问题。
每当我发送带有帖子请求的数据时,我都会收到500:内部服务器错误。如果我从请求中删除数据,它可以正常工作。
有效的示例方法:
[HttpPost]
public string Test()
{
return "this works";
}
因为我没有将任何数据传递给上述方法,所以我没有遇到任何问题。但是,每当我向我的请求添加一些数据时,就像这样:
API方法:
[HttpPost]
public string TestWithVariables(string test)
{
return test;
}
AJAX电话:
$.post({
url: myUrl + "/api/my-api/TestWithVariables",
data: { test: "123456" },
success: function (html) {
console.log("y")
},
error: function () {
console.log("n");
}
});
上面的代码在我的浏览器中输出这些错误:HTTP / 1.1 500内部服务器错误和XML解析错误:找不到根元素。事实是,如果我在API方法的第一行设置一个断点,它永远不会被击中,这意味着找不到该方法,或者由于某种原因执行该方法......?
我尝试过的一些内容:将我的参数分解为TestClass并使用[FromBody]
。我也尝试使用[FromUri]
,这实际上使方法执行,但我无法从那里访问值,因为我的值已发布在正文中。
任何想法可能导致这些问题?
答案 0 :(得分:0)
根据您提供的数据,可能的问题可能是: 你没有使用stringify将数据转换为ajax请求中的字符串json。 使用以下
data:JSON.stringify({test:“123456”});
如果它不能共享您可以共享的控制器和其他数据。
答案 1 :(得分:0)
你可以做的几件事情,首先要确保你将请求的内容类型设置为json,默认情况下,如果你不这样做,它将是xml。
如果您不需要,也可以完全删除xml格式化程序。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
}
}
此课程位于App_Start。
无论哪种方式,都要确保正确设置内容类型。
最后确保在发送数据之前对数据进行字符串化:
var model = JSON.stringify({ test: "123456" });
$.post({
url: myUrl + "/api/my-api/TestWithVariables",
data: model,
success: function (html) {
console.log("y")
},
error: function () {
console.log("n");
}
});
如果仍然无法正确击中控制器,请检查路线。
以没有参数的POST方法开始。一旦你可以点击它,添加一个参数并添加一个[FromBody]属性。
如果您收到500错误,则表示您在某处出现内部错误。在你的方法中放置一个断点,看你是否点击它。
现在,关于路线。让我们说你的控制器名为SomeController
您的路线将成为/某些/方法名称。 您可以使用控制器上的RoutePrefix属性和方法上的Route属性来完全控制路径。
说实话,我不会有这样的路线:/ api / my-api /
是的它是一个api,你的没有必要把它放在路线上。
因此,将您的RoutePrefix设置为api,并将您的路由设置为test-param然后您的网址变为:/ api / test-param例如
[RoutePrefix("api")]
public class TestController : ApiController
[HttpPost]
Route["test-param"]
public string TestWithVariables([FromBody] string test)
{
return test;
}
然后你的js:
var model = JSON.stringify({ test: "123456" });
$.post({
url: myUrl + "/api/test-param",
data: model,
contentType: "application/json",
success: function (html) {
console.log("y")
},
error: function () {
console.log("n");
}
});
我不确定contentType的正确语法,但它应该足够接近我想。
对于错误处理,我个人喜欢Elmah,一旦配置它会记录所有异常,您只需调用您的url / elmad.axd并查看所有错误报告。
最后一点,在构建API时使用一个好的客户端是个好主意。我喜欢邮差,因为它可以让你轻松地制作你需要的任何请求。一旦你在Postman中完成所有工作,你就可以在Javascript中构建该请求。
答案 2 :(得分:0)
控制器:
[HttpPost]
public string TestWithVariables([FromBody]string test) // added FromBody
{
return test;
}
的Ajax:
$.post({
url: myUrl + "/api/my-api/TestWithVariables",
data: { test: "=123456" }, //prefix data with = sign
success: function (html) {
console.log("y")
},
error: function () {
console.log("n");
}
});