我正在创建一个带有RESTful API的ASP.net MVC网站到SQL数据库。我已经实现了一个控制器来保存HTTP命令。
其中一个命令是POST
命令:
// POST: api/PoolTests
[ResponseType(typeof(PoolTest))]
public IHttpActionResult PostPoolTest(PoolTest poolTest)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.PoolTests.Add(poolTest);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = poolTest.Id }, poolTest);
}
我正在使用Fiddler测试功能,我得到一些奇怪的结果。根据自动生成的API文档,请求格式应该是具有此结构的JSON(这些是连接SQL数据库的字段):
{
"Id": 1,
"SiteID": "sample string 2",
"Date": "sample string 3",
"Tub": "sample string 4",
"par1": 5.1,
"par2": 6.1,
"par3": 7.1,
"par4": 8.1
}
在小提琴作曲家中,我选择POST
和http://localhost:53660/api/PoolTests
以及JSON有效载荷{"Id": 1,"SiteID": "sample string 2", "Date": "sample string 3","Tub": "sample string 4","par1": 5.1, "par2": 6.1,"par3": 7.1,"par4": 8.1}
这会导致HTTP 400错误代码。
如果我发送没有JSON(有效负载)的相同请求,则它会在行db.PoolTests.Add(poolTest);
处中断,因为有效负载为空。
如果我在第if (!ModelState.IsValid)
行放置一个断点,则有效负载永远不会达到断点。它几乎与有效负载一样,无法识别实际的HTTP命令。
任何想法 - 我很欣赏可能会遗漏一些细节。
ADDED:PoolTest Class
public class PoolTest
{
public int Id { get; set; }
public string SiteID { get; set; }
public string Date { get; set; }
public string Tub { get; set; }
public double par1 { get; set; }
public double par2 { get; set; }
public double par3 { get; set; }
public double par4 { get; set; }
}
FIDDLER截图已添加:
我添加了content-type
,现在我点击了断点,但Pooltest
被报告为null
答案 0 :(得分:1)
尝试将方法签名更改为:
public IHttpActionResult PostPoolTest([FromBody]PoolTest poolTest)
这应该可以让你至少达到你的断点。从那里你可以看到模型错误。
答案 1 :(得分:1)
您需要将print
移至请求正文。在Fiddler中,它将是一个单独的输入框(在屏幕截图中的输入框下方)。
data
的标题成为:
POST http://localhost:53660/api/pooltests
标题User-Agent: Fiddler
Host: localhost:53660
Content-Type: application/json
Content-Length: 140
应为 application / json ,并为您计算Content-Type
。您正在定义一个不正确的标题Content-Length
。
在请求正文中,您可以粘贴数据
data
您可以单独保留操作签名,但是当您想要向网址添加参数时,{"Id": 1,"SiteID": "sample string 2", "Date": "sample string 3","Tub": "sample string 4","par1": 5.1, "par2": 6.1,"par3": 7.1,"par4": 8.1}
会很有用。
[FromBody]
使用jQuery的AJAX请求如下所示:
[ResponseType(typeof(PoolTest))]
public IHttpActionResult PostPoolTest([FromBody] PoolTest poolTest)
{
...
}