Как получить URL-адрес закодированной формы в F# Giraffe Web API?
Я думаю о переписывании кода WebAPI в C# ASP.NET Core в F# Giraffe. Тем не менее, для некоторых конкретных конструкций я не могу найти эквивалентности, в частности для чего-то вроде ниже:
[HttpPost("DocumentValidationCallbackMessage")]
[Consumes("application/x-www-form-urlencoded")]
public async Task<IActionResult> DocumentValidationCallbackMessage([FromForm] string xml)
{
// Controller Action implementation
}
AFAIK, маршрутизация в Giraffe осуществляется не контроллерами, а функцией choose
:
let webApp =
choose [
GET >=>
choose [
route "/" >=> indexHandler
]
setStatusCode 404 >=> text "Not Found" ]
Я не могу понять, как обойти в F# Giraffe последствия атрибутов C# ASP.NET Core. [Consumes("application/x-www-form-urlencoded")]
а также [FromForm]
: как непосредственно получить значение, переданное в URL-форме.
Любая идея?
1 ответ
Choose
это лишь одна из многих функций, предоставляемых в библиотеке, чтобы помочь в создании вашего веб-приложения. Есть много других, которые мы можем использовать, чтобы получить то же поведение, что и ваш образец. Ниже приведен пример кода с комментариями, который иллюстрирует цели разработки Giraffe, которые позволяют вам объединить функциональные единицы в самоописательный конвейер:
module Sample =
open Giraffe
/// define a type for the model binding to work against.
/// This is the same as saying 'the incoming form will have an string property called xml'
[<CLIMutable>]
type Model =
{ xml: string }
let documentationValidationCallbackMessage: HttpHandler =
route "DocumentValidationCallbackMessage" // routing
>=> POST // http method
>=> bindForm<Model> None (fun { xml = xml } -> // requires the content type to be 'application/x-www-form-urlencoded' and binds the content to the Model type
// now do something with the xml
setStatusCode 200 // in our case we're just going to set a 200 status code
>=> text xml // and write the xml to the response stream
)
Все это может быть более подробно рассмотрено в документации, которая полна примеров.
Надеюсь это поможет!