Можно ли вызвать ту же самую конечную точку с помощью Giraffe из того же веб-приложения?

У меня F# WebAPI работает в.net core 2.2. Это приложение использует жирафа.

Маршрутизация настроена так, как описано здесь. Пример:

let webApp =
choose [
    GET >=>
        choose [
            route  "/"           >=> text "index"
            route  "/ping"       >=> text "pong"
            route  "/error"      >=> (fun _ _ -> failwith "Something went wrong!")
            route  "/login"      >=> loginHandler
            route  "/logout"     >=> signOut authScheme >=> text "Successfully logged out."
            route  "/user"       >=> mustBeUser >=> userHandler
        ]
    route "/car"  >=> bindModel<Car> None json
    route "/car2" >=> tryBindQuery<Car> parsingErrorHandler None (validateModel xml)
    RequestErrors.notFound (text "Not Found") ]

У нас есть проверка работоспособности, которую мы хотели бы запустить из приложения и выполнить по этим маршрутам, однако мы не хотим делать внешние вызовы нашего API (например, используя HttpClient или аналогичный).

Можно ли вызывать эти маршруты внутренне - без простого вызова функций, на которые они направляются? В идеале мы хотели бы быть уверены, что наша маршрутизация работает правильно для всех конечных точек.

Конечно, мы попытались извлечь HttpClientFactory -> HttpClient из внешнего источника, но это приводит к проблемам с ключами API, внешней маршрутизацией, несколькими средами и т. Д.

Любые идеи будут приветствоваться!

1 ответ

В соответствии с документами Giraffe webApp, которые вы определили, это HttpHandler. Из документов:

type HttpFuncResult = Task<HttpContext option>
type HttpFunc = HttpContext -> HttpFuncResult
type HttpHandler = HttpFunc -> HttpContext -> HttpFuncResult

select - это комбинатор, который берет список HttpHandler и формирует другой HttpHandler.

Как видите, HttpHandler - это функция. Таким образом, вы можете смоделировать HttpContext и попытаться вызвать webApp с параметром HttpFunc fun _ -> None. Что-то вроде:

let httpResult = webApp (fun _ -> None) mockedContext
Другие вопросы по тегам