Как получить URL-адрес закодированной формы в F # Giraffe Web API? - PullRequest
3 голосов
/ 07 мая 2019

Я думаю о переписывании кода 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 Ответ

4 голосов
/ 07 мая 2019

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
      )

Все это может быть более подробно рассмотрено в документации , которая полна примеров.

Надеюсь, это поможет!

...