All Projects → softwaremill → Tapir

softwaremill / Tapir

Licence: apache-2.0
tapir, or Typed API descRiptions

Programming Languages

scala
5932 projects

Projects that are alternatives of or similar to Tapir

Endpoints4s
Scala library to define HTTP-based communication protocols
Stars: ✭ 331 (-51.11%)
Mutual labels:  openapi, akka-http
sbt-guardrail
Principled code generation from OpenAPI specifications
Stars: ✭ 24 (-96.45%)
Mutual labels:  akka-http, openapi
swakka
A Scala library for creating Swagger definitions in a type-safe fashion wth Akka-Http
Stars: ✭ 74 (-89.07%)
Mutual labels:  akka-http, openapi
Guardrail
Principled code generation from OpenAPI specifications
Stars: ✭ 396 (-41.51%)
Mutual labels:  openapi, akka-http
Apisprout
Lightweight, blazing fast, cross-platform OpenAPI 3 mock server with validation
Stars: ✭ 519 (-23.34%)
Mutual labels:  openapi
Studio
The modern editor for API Design and Technical Writing.
Stars: ✭ 459 (-32.2%)
Mutual labels:  openapi
Openapi Specification
The OpenAPI Specification Repository
Stars: ✭ 22,603 (+3238.7%)
Mutual labels:  openapi
Nswag
The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript.
Stars: ✭ 4,825 (+612.7%)
Mutual labels:  openapi
Angular Springboot Rest Jwt
Springboot, Angular and JWT security - Example Project based on Northwind Order Processing
Stars: ✭ 603 (-10.93%)
Mutual labels:  openapi
Bravado
Bravado is a python client library for Swagger 2.0 services
Stars: ✭ 560 (-17.28%)
Mutual labels:  openapi
Create Openapi Repo
🤖 Generator for GH repo to help you manage the OpenAPI definition lifecycle
Stars: ✭ 513 (-24.22%)
Mutual labels:  openapi
Swagger Parser
Swagger Spec to Java POJOs
Stars: ✭ 468 (-30.87%)
Mutual labels:  openapi
Akka Http Json
Integrate some of the best JSON libs in Scala with Akka HTTP
Stars: ✭ 530 (-21.71%)
Mutual labels:  akka-http
Nirvana
Golang Restful API Framework for Productivity
Stars: ✭ 460 (-32.05%)
Mutual labels:  openapi
Springfox
Automated JSON API documentation for API's built with Spring
Stars: ✭ 5,449 (+704.87%)
Mutual labels:  openapi
Swagger Ui
Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.
Stars: ✭ 21,279 (+3043.13%)
Mutual labels:  openapi
Quick Cocos2dx Community
Cocos2d-Lua 社区版
Stars: ✭ 504 (-25.55%)
Mutual labels:  openapi
Swagger Express Middleware
Swagger 2.0 middlware and mocks for Express.js
Stars: ✭ 543 (-19.79%)
Mutual labels:  openapi
Open Api
A Monorepo of various packages to power OpenAPI in node
Stars: ✭ 497 (-26.59%)
Mutual labels:  openapi
Datafire
A framework for building integrations and APIs
Stars: ✭ 487 (-28.06%)
Mutual labels:  openapi

tapir, or Typed API descRiptions

Join the chat at https://gitter.im/softwaremill/tapir CI Maven Central

With tapir, you can describe HTTP API endpoints as immutable Scala values. Each endpoint can contain a number of input parameters, error-output parameters, and normal-output parameters. An endpoint specification can be interpreted as:

  • a server, given the "business logic": a function, which computes output parameters based on input parameters. Currently supported:
  • a client, which is a function from input parameters to output parameters. Currently supported:
  • documentation. Currently supported:

Teaser

import sttp.tapir._
import sttp.tapir.generic.auto._
import sttp.tapir.json.circe._
import io.circe.generic.auto._

type Limit = Int
type AuthToken = String
case class BooksFromYear(genre: String, year: Int)
case class Book(title: String)


// Define an endpoint

val booksListing: Endpoint[(BooksFromYear, Limit, AuthToken), String, List[Book], Any] = 
  endpoint
    .get
    .in(("books" / path[String]("genre") / path[Int]("year")).mapTo(BooksFromYear))
    .in(query[Limit]("limit").description("Maximum number of books to retrieve"))
    .in(header[AuthToken]("X-Auth-Token"))
    .errorOut(stringBody)
    .out(jsonBody[List[Book]])


// Generate OpenAPI documentation

import sttp.tapir.docs.openapi.OpenAPIDocsInterpreter
import sttp.tapir.openapi.circe.yaml._

val docs = OpenAPIDocsInterpreter.toOpenAPI(booksListing, "My Bookshop", "1.0")
println(docs.toYaml)


// Convert to akka-http Route

import sttp.tapir.server.akkahttp.AkkaHttpServerInterpreter
import akka.http.scaladsl.server.Route
import scala.concurrent.Future

def bookListingLogic(bfy: BooksFromYear,
                     limit: Limit,
                     at: AuthToken): Future[Either[String, List[Book]]] =
  Future.successful(Right(List(Book("The Sorrows of Young Werther"))))
val booksListingRoute: Route = AkkaHttpServerInterpreter
  .toRoute(booksListing)((bookListingLogic _).tupled)


// Convert to sttp Request

import sttp.tapir.client.sttp.SttpClientInterpreter
import sttp.client3._

val booksListingRequest: Request[DecodeResult[Either[String, List[Book]]], Any] = SttpClientInterpreter
  .toRequest(booksListing, Some(uri"http://localhost:8080"))
  .apply((BooksFromYear("SF", 2016), 20, "xyz-abc-123"))

Documentation

tapir documentation is available at tapir.softwaremill.com.

Quickstart with sbt

Add the following dependency:

"com.softwaremill.sttp.tapir" %% "tapir-core" % "0.17.19"

You'll need partial unification enabled in the compiler (alternatively, you'll need to manually provide type arguments in some cases):

scalacOptions += "-Ypartial-unification"

Then, import:

import sttp.tapir._

And finally, type endpoint. and see where auto-complete gets you!


Sidenote for scala 2.12.4 and higher: if you encounter an issue with compiling your project because of a StackOverflowException related to this scala bug, please increase your stack memory. Example:

sbt -J-Xss4M clean compile

Other sttp projects

sttp is a family of Scala HTTP-related projects, and currently includes:

  • sttp client: the Scala HTTP client you always wanted!
  • sttp tapir: this project
  • sttp model: simple HTTP model classes (used by client & tapir)

Contributing

Tapir is an early stage project. Everything might change. All suggestions welcome :)

See the list of issues and pick one! Or report your own.

If you are having doubts on the why or how something works, don't hesitate to ask a question on gitter or via github. This probably means that the documentation, scaladocs or code is unclear and be improved for the benefit of all.

Testing locally

The JS tests use Gecko instead of Chrome, although this causes another problem: out of memory when running JS tests for multiple modules. Work-arounds:

  • run only JVM tests using testJVM
  • test single JS projects
  • use CI (GitHub Actions) to test all projects - the .github/workflows/ci.yml enumerates them one by one

You can test only server/client/doc/other projects using testServers, testClients, testDocs and testOther.

Commercial Support

We offer commercial support for tapir and related technologies, as well as development services. Contact us to learn more about our offer!

Copyright

Copyright (C) 2018-2020 SoftwareMill https://softwaremill.com.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].