`Страница не найдена (404)` в конечной точке POST с данными JSON - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь использовать конечную точку 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 голосов
/ 29 января 2019

Форма HTML не отправляет информацию в формате Json, вместо этого она использует кодировку url, которая аналогична параметрам запроса в URL, за исключением того, что они идут в теле запроса, а не в URL, например, если у вас есть2 поля User & Password:

User=John&Password=123456

Чтобы получить данные из формы, вам нужно использовать атрибут [< FormData >]:

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

и указать значение EndPoint следующим образом:

 | [< EndPoint "POST /demo" >]  Demo of data: Data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...