带有JSON数据的POST端点中的“页面未找到(404)”

时间:2019-01-29 13:06:44

标签: forms post f# websharper

我正在尝试使用一个POST端点,该端点从JSON表单接受HTML数据,但结果只能是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>

Site.fs添加处理表单请求的代码:

type Data = { name: string }

type EndPoint =
    | [<EndPoint "GET /">] Home
    | ...
    | [<EndPoint "POST /demo"; Json "data">] Demo of data: Data
    | [<EndPoint "POST /demo">] DemoFallback

[<Website>]
    let Main =
        Application.MultiPage (fun ctx endpoint ->
            match endpoint with
            | ...
            | EndPoint.Demo data ->
                printfn "Data: %A" data
                Content.Text "Ok demo with post data"
            | EndPoint.DemoFallback ->
                Content.Text "I don't expect this route"
        )

再次运行项目:

dotnet run

从浏览器中我得到I don't expect this route,但从curl中得到:

curl -i -H "Content-Type: application/json" \
  -XPOST "http://localhost:5000/demo" \
  -d '{ "name": "me" }'

或具有不同的content-type

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

我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

HTML表单不会以Json格式发送信息,而是使用url编码,它类似于url中的查询参数,只是它们放在请求的正文中,而不是URL中(例如,如果您有2个字段“用户名和密码”:

User=John&Password=123456

为了从表单接收数据,您需要使用[< FormData >]属性:

type Data = { [< FormData >] name: string }

并指出EndPoint的内容:

 | [< EndPoint "POST /demo" >]  Demo of data: Data