Forms `在包含JSON数据的POST端点中找不到页面(404)`

Forms `在包含JSON数据的POST端点中找不到页面(404)`,forms,post,f#,websharper,Forms,Post,F#,Websharper,我试图使用一个POST端点,该端点接受HTML表单中的JSON数据,但结果只能获取404-Page not found,除非我添加了另一个没有有效负载的端点 因此,我可以从模板创建一个演示项目,并进行一些小更改以测试此问题: cd /tmp dotnet new websharper-web --name Demo --language F# cd Demo dotnet run ## Ok! 编辑main.html以添加表单: <div class="container">

我试图使用一个
POST
端点,该端点接受
HTML
表单中的
JSON
数据,但结果只能获取
404-Page not found
,除非我添加了另一个没有有效负载的端点

因此,我可以从模板创建一个演示项目,并进行一些小更改以测试此问题:

cd /tmp
dotnet new websharper-web --name Demo --language F#
cd Demo
dotnet run   ## Ok!
编辑
main.html
以添加表单:

<div class="container">
    ...
</div>
<form method="post" action="/demo" enctype="application/x-www-form-urlencoded">
    <label>Name</label>
    <input type="text" name="name" />
    <button type="submit">Post</button> 
</form>
<footer class="footer">
...
</footer>
再次运行项目:

dotnet run
从浏览器中,我得到了
我不期望这条路线
,但是从
curl

curl -i -H "Content-Type: application/json" \
  -XPOST "http://localhost:5000/demo" \
  -d '{ "name": "me" }'
或使用不同的
内容类型

curl -i -H "Content-Type: application/x-www-form-urlencoded" \
  -XPOST "http://localhost:5000/demo" \
  -d '{ "name": "me" }'
两者都产生:

HTTP/1.1 200 OK
Date: Tue, 29 Jan 2019 12:57:19 GMT
Server: Kestrel
Transfer-Encoding: chunked

Ok demo with post data

这里我遗漏了什么?

HTML表单不以Json格式发送信息,而是使用url编码,这与url中的查询参数类似,只是它们位于请求正文中,而不是url中,例如,如果您有两个字段User&Password:

User=John&Password=123456
要从表单接收数据,您需要使用
[]
属性:

type Data = { [< FormData >] name: string }
类型数据={[]名称:字符串}
并指出端点lile,如下所示:

 | [< EndPoint "POST /demo" >]  Demo of data: Data
|[]数据演示:数据

@AMieres:不完全正确,因为如果我删除
DemoFallback
路径,浏览器在提交表单后会返回一个
(404)未找到的页面。根据文档,您是对的,它会按声明的顺序尝试选项,并使用第一个匹配的选项。这意味着浏览器发送的JSON的形式不是
{“name”:“…”}
@AMieres:形式和类型已经有一个字段:(
)和
类型数据={name:string}
。根据这篇文章:表单不会以Json格式发送,除非您以这种方式序列化它。@AMieres:您的最后一条评论是对的。它使用文档中的
[]
而不是
[]
工作。将它添加到一个答案中,这样我就可以批准它。我对那些
表单
参数感到困惑,所以非常感谢您帮助我理解和解决它。没问题,它也帮助我理解它。
 | [< EndPoint "POST /demo" >]  Demo of data: Data