`Страница не найдена (404)` в конечной точке POST с данными JSON
Я пытаюсь использовать 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 ответ
HTML-форма не отправляет информацию в формате Json, вместо этого она использует URL-кодировку, которая аналогична параметрам запроса в URL-адресе, за исключением того, что они идут в теле запроса, а не в URL-адресе, например, если у вас есть 2 поля User & Пароль:
User=John&Password=123456
Для получения данных из формы вам необходимо использовать [< FormData >]
атрибут:
type Data = { [< FormData >] name: string }
и указать конечную точку это:
| [< EndPoint "POST /demo" >] Demo of data: Data