我想要实现的最终目标是从HTTP POST请求获取MULTIPLE PARAMS,所以如果您知道其他任何方法,请通知我。
我正在使用
Content-Type: application/json
添加到标题中!我试过的第一个代码如下所示:
[RoutePrefix("report")]
public class DefaultController : ApiController
{
[HttpPost, Route("error")]
public HttpResponseMessage Echo(string uid, string buildNumber, string log,
string stack, string context, ...)
{
Console.WriteLine("received message: ");
Console.WriteLine(" uid: " + uid);
Console.WriteLine(" buildNumber: " + buildNumber);
Console.WriteLine(" log: " + log);
Console.WriteLine(" stack: " + stack);
...
return Request.CreateResponse(HttpStatusCode.OK);
}
}
但如果我尝试访问路由到控制器的http://localhost:XXX/report/error
,我收到以下消息:
No HTTP resource was found that matches the request URI
我有点想通了对于POST消息,我必须使用Model来使用单个参数(这是真的吗?),所以我添加了一个名为ReportModel
的模型,并修改如下:
[RoutePrefix("report")]
public class DefaultController : ApiController
{
[HttpPost, Route("error")]
public HttpResponseMessage Echo(ReportModel report)
{
Console.WriteLine("received message: ");
Console.WriteLine(" uid: " + report.Uid);
Console.WriteLine(" buildNumber: " + report.BuildNumber);
Console.WriteLine(" log: " + report.Log);
Console.WriteLine(" stack: " + report.Stack);
...
return Request.CreateResponse(HttpStatusCode.OK);
}
}
现在我获得参数null
的{{1}}值。请帮我弄清楚如何在HTTP POST中获取多个参数。
【解析(也许?)]
RAW数据如下所示:
report
我正在发送' 表单数据' Postman Chrome扩展程序中的标签,无法一次又一次地工作。 然后我改为' raw'选项卡,然后它就可以正常工作。
我仍然不知道问题是什么。但是,非常感谢你的帮助。
答案 0 :(得分:0)
您需要配置Web API路由以接受ReportModel参数。
config.Routes.MapHttpRoute(name: "newont",
routeTemplate: "api/{controller}/{ReportModel}/{id}",
defaults: new { controller = "Controllername", ReportModel= "ReportModel", new { id = RouteParameter.Optional }}
);
答案 1 :(得分:0)
使用API时,最好将模型用于多个参数。
如果您使用的是Javascript,则使用模型中的相同名称构建对象,它们将在请求中进行映射。
此外,如果你需要相同的数据来操作前端,你可以建立一个对象并像这样返回
return Request.CreateResponse(HttpStatusCode.OK, myObject);
答案 2 :(得分:0)
你可以从jquery调用post方法并传递数据字段中的参数。
$.ajax(
{
url: "report/error",
type: "POST",
data: { uid: "1", buildNumber: "123", log ="log string", context = "context", stack = { property: "value"} },
success: function (result) {
alert(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
alert(err);
}
});
答案 3 :(得分:0)
确保发布到Web API操作的数据结构与模型的数据结构匹配。
为了帮助您进行调试,您可以安装名为Swashbuckle的Nuget包。 Swashbuckle记录了您当前基于MVC / Web API的控制器和操作,并考虑了每个控制器和输出的输入和输出。最好的部分(以及最能帮助你的部分)是它提供了一个用于测试每个动作的UI,甚至可以根据动作参数的结构创建所需的数据结构。
安装软件包会创建一个路由(例如http://myrooturl/swagger)供您访问UI本身,因此无需配置,因为它开箱即用。
如果您可以使用它来执行API操作并填充参数,那么您手动创建POST的方法就有问题。如果由于某种原因它仍然失败,那么至少你有一个自我文档的方法,因为Swagger UI会自动更新动作列表。