[HN Gopher] Show HN: REST Alternative to GraphQL and tRPC
       ___________________________________________________________________
        
       Show HN: REST Alternative to GraphQL and tRPC
        
       Author : anttiviljami
       Score  : 108 points
       Date   : 2023-10-10 09:58 UTC (13 hours ago)
        
 (HTM) web link (openapistack.co)
 (TXT) w3m dump (openapistack.co)
        
       | isuckatcoding wrote:
       | More a comment on the main page.
       | 
       | Show some code or small example on that main page. I have no idea
       | or sense to compare it to graphql without some small toy example.
        
         | anttiviljami wrote:
         | Thanks for the feedback!
         | 
         | There is a full interactive sandbox example on the
         | front/landing page https://openapistack.co
         | 
         | But point taken, will make sure code examples are visible on
         | the overview page
        
       | notpushkin wrote:
       | Congrats on the launch!
       | 
       | How does this compare to other solutions, like https://openapi-
       | ts.pages.dev/?
        
         | anttiviljami wrote:
         | Good idea to add to the comparisons page!
         | 
         | The openapi-typescript package is a library for generating
         | types from openapi spec, similar to the openapicmd typegen
         | command provided by openapi-stack.
         | 
         | The new openapi-typescript-fetch seems similar to openapi-
         | client-axios, but using fetch instead of axios for a more
         | lightweight approach.
         | 
         | Both libraries are great and well aligned with goals of
         | openapi-stack!
         | 
         | In addition to type generation and consuming APIs,
         | https://openapistack.co provides tools for building and mocking
         | API backends with the openapi-backend library, as well as a
         | general cli tool to work with openapi files and invoke APIs via
         | the command line.
         | 
         | The core mission of https://openapistack.co is to bring
         | together tools for an end to end full stack toolkit for
         | building and consuming typesafe REST APIs.
        
       | mortallywounded wrote:
       | Is it just me, or do these "API contracts and type safety
       | guarantees" all call back to SOAP?
        
         | cryptonector wrote:
         | All the way back to Apollo Domain.
        
         | brightball wrote:
         | WSDL
        
         | nine_k wrote:
         | The core idea of SOAP was good. The ability to generate client
         | and server code stubs from a single declarative file was great.
         | I worked with SOAP extensively in early 2000s.
         | 
         | The problem that killed SOAP, to my mind, was growing
         | complexity that eventually started to outweigh the benefits of
         | the protocol. Not every implementation supported every new
         | complication that, say, MS kept inventing, it hurt
         | interoperability.
         | 
         | I think a modern sort-of-replacement for the SOAP's use case is
         | GRPC. It eschews the heavyweight XML and tries to keep things
         | simple, while staying reasonably typesafe, declarative,
         | discoverable, and extendable.
        
           | chrisweekly wrote:
           | Speaking from painful experience, gRPC is an absolutely
           | terrible choice for client-server interactions. Google (its
           | creator) discourages its use except for server-to-server, and
           | Improbable labs' grpc-web library is handcuffed to brittle
           | and rapidly-aging web tooling.
        
             | nine_k wrote:
             | GRPC is compact; in some cases it's important.
             | 
             | What would you suggest, beyond the standard "ReST" and
             | GraphQL, with OpenAPI as a declarative description?
        
               | rattray wrote:
               | For a compact message format being sent to browsers, you
               | might look at messagepack, eg with
               | https://github.com/msgpack/msgpack-javascript - it's
               | essentially binary JSON, so it'd be compatible with
               | OpenAPI specs.
               | 
               | I _think_ the ser /des is slower than JSON in most
               | browsers, but the message format is smaller.
               | 
               | Oftentimes, using a query parameter like `?exclude[]=...`
               | or `?include[]=...` or similar to say "only get me these
               | response fields, not the whole object" can be useful for
               | this too (and then you still get JSON back).
        
         | jjice wrote:
         | Yes it's an interesting trend. I integrate with a good handful
         | of systems in my current work and the most important ones we
         | integrate with are SOAP based. The concepts behind a WSDL are
         | great in theory, but they end up incorrect or unmaintained in
         | practice (at least with the systems I integrate with). There's
         | something freeing and flexible about a plain REST API that
         | makes developing your own wrapper nice and simple, but if all
         | communication is between internal systems, a contract based
         | approach seems great.
        
         | anttiviljami wrote:
         | Yes! SOAP wsdl, but json
        
       | coding123 wrote:
       | GraphQL is more future proof than rest.
       | 
       | Rest is tied to HTTP forever - GraphQL can be separated, easily.
       | 
       | Rest communicates inputs and outputs in too many ways for my
       | liking any more: headers, paths, bodies, query params, and dare I
       | say method.
       | 
       | One complaint for GQL is that potentially they had a chance to
       | standardize paging, filtering, etc... instead every schema is
       | customized.
       | 
       | I guess we'll have to create a new standard at some point. We'll
       | never get this shit right.
        
         | anttiviljami wrote:
         | I don't really agree GraphQL is somehow more "future proof"
         | because it doesn't use as many HTTP features.
         | 
         | It's not like HTTP is going to go away in a while.
         | 
         | I find that AsyncAPI is a nice extension of OpenAPI/REST ideas
         | if you need to go beyond request / response.
        
           | mdaniel wrote:
           | If I'm understanding coding123's comment correctly, I think
           | AsyncAPI would need to be extended to allow specifying a
           | _GraphQL schema_ and not just a _JSON schema_ as the message
           | payload and (I guess implied?) response types
        
       | Sytten wrote:
       | What I really like with graphql that IMO all the other spec lack
       | is a nice human readable format. When as a team you design a new
       | API no way I am going to write openapi spec, but I can reason in
       | GraphQL schema. Then each side takes the contract and go
       | implement the frontend and the backend and it just works.
        
         | CharlieDigital wrote:
         | If you want to do that, try gRPC and Proto.
         | 
         | But I feel like REST and OpenAPI are fine especially if you
         | start from the backend. I think with .NET Web APIs, the story
         | is particularly good since it has out-of-the-box tooling for
         | OpenAPI spec generation based on your exposed endpoints and
         | models and then the option to customize that as needed.
         | 
         | I've recently been working with it trying to get hot reload
         | working on the frontend client generation and it's a fantastic
         | DX with minimal wiring: https://chrlschn.dev/blog/2023/10/end-
         | to-end-type-safety-wit...
        
           | Sytten wrote:
           | Grpc browser support is pretty bad, I still can't wrap my
           | head around the whole grpc-web thing that looks like giant
           | hacks.
           | 
           | Openapi is not human readable IMO and the point is you design
           | the API waaaay before you write any line of code. The api
           | should express the business needs and be a two way discussion
           | with the frontend people.
        
             | CharlieDigital wrote:
             | OpenAPI itself doesn't need to be human readable because
             | it's readily translated into human readable form using
             | tools like Redocly, RapiDoc, or any other host of tools
             | that create output documents from input OpenAPI spec.
        
           | dontlaugh wrote:
           | There's also Twirp, if gRPC doesn't fit your requirements.
        
         | gadflyinyoureye wrote:
         | Auto generate the contract. That might be easier in some
         | languages like TypeScript or Java, but it's just done as part
         | of the build.
        
           | anttiviljami wrote:
           | You don't actually want that.
           | 
           | Code should not inform design.
           | 
           | Design informs code.
        
             | gadflyinyoureye wrote:
             | Use the code to do the design. Don't implement the damn
             | thing. Just work in a nicer medium like Typescript. Add
             | attributes. Remove attributes. Move things around in the
             | refactoring tool. Then generate the doc. Forget about the
             | whole "this is what the database does" stuff.
        
         | junon wrote:
         | There are many, many frameworks for IPC/RPC or even REST that
         | have human-readable schemas.
         | 
         | GraphQL is a performance nightmare, and while it might have
         | nice and flashy dev tooling, it's fundamentally unoptimizable
         | without extensive development investment - something that isn't
         | an issue with REST.
        
           | Sytten wrote:
           | Citations very much needed for REST. JsonSchema is not human
           | readable. Some RPC yes but their support on web tech is meh
           | (grpc-web for example is a mess).
           | 
           | Having written large code bases in graphql I really disagree
           | with this statement. It is just a different mindset and I
           | like it. It does make you think way more in terms of data and
           | their relations instead of endpoints. Sure you might get N+1
           | problems but its easy to mitigate and I prefer doing that on
           | the backend instead of the frontend doing those calls.
        
           | lbhdc wrote:
           | > GraphQL is a performance nightmare, and while it might have
           | nice and flashy dev tooling, it's fundamentally unoptimizable
           | without extensive development investment - something that
           | isn't an issue with REST.
           | 
           | That feels really true. I worked on a really large gql api,
           | and it was a performance nightmare, lots of 10+ second
           | queries that thrashed our database.
           | 
           | Fine grained security was a nightmare. We found no existing
           | solutions, and rolled a few different solutions for this that
           | were all awful and leaky. Eventually we threw a bunch of
           | money at h1 to tease it all out.
        
       | arcbyte wrote:
       | There's no winning at this layer and every attempt is as doomed
       | as medieval alchemists trying to transmute lead to gold.
       | 
       | The key here is overall speed, but you can't trade the time spent
       | learning/understanding the API contract for these crazy
       | complicated tools. The developer still has to look at the
       | operations and data models exposed by the API, understand them,
       | amd plan for how to integrate them into the larger application.
       | 
       | The big bonus of the human documentation approaches today is that
       | time is somewhat combined with building the client. The downside
       | of course is that it's a human doing it. My point here is that
       | you can't take the time a human is going to spend understanding
       | the API concepts and then tack on a bunch of time learning,
       | configuring, and running the client gen code and associated
       | infrastructure as well and expext that your solution is going to
       | win.
       | 
       | The more complicated these codegen setups get, the less comicated
       | just reading some docs and spinning up a few lines of client code
       | is. And guess which I'm going to choose as a dev? Whatever is
       | overall fastest and gets me on to the problems I'm really trying
       | to solve.
        
         | t1mmen wrote:
         | Strong disagree.
         | 
         | The barrier you presume is that OpenAPI specs are hard to
         | write. Raw oAPI in yaml is indeed a pain, but there are good
         | DSL's out there.
         | 
         | I personally love Zod->OpenAPI, via https://ts-rest.com which
         | uses https://www.npmjs.com/package/@anatine/zod-openapi.
         | https://github.com/asteasolutions/zod-to-openapi is another
         | alternative for Zod.
         | 
         | > The big bonus of the human documentation approaches today is
         | that time is somewhat combined with building the client.
         | 
         | This is wild to me; human documentation is absurdly error-prone
         | and it's almost always and immediately out of date. (Zod or
         | other DSL) -> OpenAPI -> generated docs (and types! and
         | clients! and mocks!) are always going to be better; always
         | accurate, and faster. The upfront cost is slightly higher, but
         | the ROI is _significant_.
         | 
         | OpenAPI specs lend themselves to excellent docs, ala Mintify or
         | Docusaurus. Even interactive ones, like Swagger UI. The vast
         | majority of API browsers & tooling understands OAPI, so why re-
         | create (an often incomplete) version of the truth when using
         | those tools?
         | 
         | > Whatever is overall fastest and gets me on to the problems
         | I'm really trying to solve.
         | 
         | You may start (slightly) faster, but you'll incur significant
         | cost when you move past the "trivial implementation" stage.
         | 
         | For instance:
         | 
         | - Do you do request & response validation on the server?
         | That'll often need duplication on the client (e.g, error
         | messages, and once out of sync, client-side validation
         | mismatches server-side response)
         | 
         | - Typescript on client & server? Then you're already doing the
         | manual work (often more than once) that oAPI->types would get
         | you for free.
         | 
         | - Implementing client-side XHR calls manually, and getting
         | typing right, is a pretty significant undertaking. Multiply
         | that by the number of client-side stacks the API will be
         | consumed by. Or, just generate them via OAPI (or real-time
         | infer via something like ts-rest)
         | 
         | - TS on client, but another BE stack? OpenAPI, when used right,
         | ensures the "contract" is 1:1. When BE changes, client needs
         | changing -- or it breaks. You want this safety.
         | 
         | - Manually mocking API responses is wasteful; write good oAPI
         | specs and auto-generate mocks (e.g, MSW).
         | 
         | - Do you test the real API implementation? OpenAPI specs can
         | help you do that automatically.
         | 
         | At this stage of my career, I would turn down a job offer from
         | a company/team that wasn't willing to use OpenAPI or equivalent
         | single-source-of-truth (*unless I'm in a truly desperate
         | situation)
        
         | progx wrote:
         | That is why we now step back to SSR-apps. No api necessary, no
         | extra layers, no extra bloat and it is fast and scalable enough
         | for the most apps.
        
           | throwaway11004 wrote:
           | Who's we?
           | 
           | Most apps nowadays have a mobile app, so you need the API
           | anyways...
        
         | anttiviljami wrote:
         | This project is precisely for devs who dislike codegen and want
         | to just ship products fast.
         | 
         | 1. Design your API in yaml 2. Run a mock API 3. Develop the
         | App, iterate mock API 4. Implement backend and ship
         | 
         | No code generation needed. Generate types if you want.
        
           | tnolet wrote:
           | How is designing an API in YAML "fast"? Isn't using code
           | much, much faster for the average dev?
        
             | anttiviljami wrote:
             | Speaking personally as a full stack engineer, unless the
             | backend is completely trivial to implement I find it much
             | faster and more efficient to write and iterate JSON schema
             | while implementing frontend features than actually
             | implement backend logic first.
        
       | theogravity wrote:
       | Awesome job! I really liked that you built it in a way that it's
       | framework-agnostic and you also have parameter validation built
       | in!
       | 
       | This might be the best OpenAPI Typescript-based project I've seen
       | so far. The ones I've used often tie you into a specific
       | framework and do not perform any validation on the parameters at
       | all.
        
         | anttiviljami wrote:
         | Thank you for the kind words!
        
       | okal wrote:
       | GraphQL is well over a decade old. I'm not sure "tried and
       | tested" is a meaningful contrast between the two approaches at
       | this point, especially as it relates to API requests from the
       | frontend. It's okay for people to choose REST just because they
       | like it better, and/or aren't interested in learning something
       | different.
        
         | paulddraper wrote:
         | GraphQL's first draft release was 8 years ago. [1]
         | 
         | It's first non-draft release was 5 years ago. [2]
         | 
         | It's first release under community governance was 2 years ago.
         | [3]
         | 
         | [1] https://github.com/graphql/graphql-
         | spec/releases/tag/July201...
         | 
         | [2] https://github.com/graphql/graphql-
         | spec/releases/tag/June201...
         | 
         | [3] https://github.com/graphql/graphql-
         | spec/releases/tag/October...
        
           | andrewingram wrote:
           | I think I shipped my first production GraphQL server around
           | this time 8 years ago, but by all accounts it was in use at
           | Facebook a couple of years before it was opened up. So
           | overall ~10 years old sounds right, though the released spec
           | is a little different to the internal version that predates
           | it.
        
             | paulddraper wrote:
             | By that standard MyCorpInnerPlatform is very mature.
        
         | anttiviljami wrote:
         | Agree. GraphQL is well mature by this point.
        
       | t1mmen wrote:
       | Cool to see more of these kinds of projects, nice work OP!
       | 
       | I'm a huge fan of this general concept, so you're definitely on
       | the right path imo. That said, two things are jumping out at me:
       | 
       | - Users would still be writing OpenAPI specs/JSON Schema by hand,
       | an incredibly annoying and tedious process (unless using a nicer
       | DSL)
       | 
       | - Generation/build steps are annoying (but likely unavoidable
       | here)
       | 
       | As pointed out by many other comments, an unfortunate amount of
       | teams aren't writing OAPI specs. I personally feel this is a
       | major mistake for anyone building an API, but that's a discussion
       | for another day.
       | 
       | I've been using https://www.ts-rest.com, a similar project, for a
       | few months now. Instead of relying on OpenAPI specs as the
       | source, you define the "contracts" using Zod. These contracts are
       | essentially OpenAPI specs, but Zod makes for a MUCH better DSL. I
       | really like that...
       | 
       | - Real-time type checking without generator steps, both server &
       | client-side. XHR clients like `fetch`, `react-query`, etc clients
       | are inferred from the contract.
       | 
       | - The Zod contracts _can_ generate/output OpenAPI specs and Mock
       | Service Worker mocks for testing (as needed, not required)
       | 
       | - (Optional) Automatic request & response validation based on Zod
       | contract definitions, no additional code needed.
       | 
       | - (Node) Backend agnostic (partially, anyway: NextJS, Express,
       | Nest and Fastify supported atm)
       | 
       | - Works very well with `react-hook-form` & `ZodResolver`, so e.g
       | an invalid value on client-side shows the same error as the API
       | would have if request were fired.
       | 
       | - Zod types can be used as typescript (z.infer), a wonderful way
       | to re-use e.g model types in client-side components.
       | 
       | This ts-rest experience has fundamentally solidified a belief in
       | me: One single source of truth, propagating through the system,
       | is _the_ best way to build safely and efficiently.
       | 
       | I am almost ashamed to look back on the many, many projects I've
       | worked on where APIs and client-side did not share truth.
       | Duplication of (hand-rolled) types, error messages, etc is
       | horrific in retrospect.
       | 
       | I don't want to think about the amount of bugs I've come across
       | due to this dual (at best) truth approach.
        
         | anttiviljami wrote:
         | Thank you for your encouraging words and insights!
         | 
         | There are indeed popular DSLs and code to openapi solutions out
         | there. Many of which are easy to plug in to the openapi-stack
         | libraries btw!
         | 
         | I guess I personally always found it frustrating to try to
         | control the generated OpenAPI output using additional tooling
         | and ended up preferring yaml + a visualisation tool as the api
         | design workflow. (e.g. swagger editor)
         | 
         | But something like https://buildwithfern.com, or using zod as
         | substitute for json schema may indeed be worth a try as a step
         | before emitting openapi.
        
           | t1mmen wrote:
           | Good point, and one that counts towards ts-rest atm; If
           | you're bringing your own OpenAPI spec, there is (not yet) an
           | OpenAPI->Zod converter available.
           | 
           | The great thing about OAPI is there's _so much tooling_
           | available, but it can be daunting and very frustrating to
           | find the "right one". I spent more hours than I'd care to
           | count wading through the ecosystem,
           | 
           | Perhaps it'd be a good idea to promote a few tools via your
           | project? I suspect many potential users would fall off early
           | because they (imo wrongly) believe the upfront cost of
           | writing the OAPI spec is too much to ask. I do understand the
           | reaction if they don't know of good DSLs, though.
           | 
           | IMO, https://openapistack.co/docs/examples/building-
           | apis/#writing... would be a good place to add that.
           | 
           | PS: ts-rest's video on the front page is what immediately
           | convinced me to try it out. Your current interactive example
           | is nice, _but_ it doesn't product type errors for me so the
           | value isn't as immediately obvious (I'm assuming watch
           | doesn't work in the sandbox?).
        
       | moltar wrote:
       | It's a really good solution.
       | 
       | Wish it would use undicci/fetch instead of axios though.
        
       | barefeg wrote:
       | How do you make sure that the spec is in sync with the
       | implementation?
        
         | anttiviljami wrote:
         | The spec is used in runtime for routing and validation.
         | 
         | https://openapistack.co/docs/examples/building-apis/
        
           | barefeg wrote:
           | Thanks. I missed this part
           | https://openapistack.co/docs/openapi-backend/typescript/ so
           | the types are generated for the backend to use. We've used
           | API first approach before, but it was very painful to keep
           | the types in sync. Now we're transitioning to FastAPI which
           | allows to more or less create the OpenAPI types in code (via
           | pydantic which can export the python types into OpenAPI
           | schema).
           | 
           | We now follow a kind of hybrid approach in which the routes
           | and types are created in code first, without actual
           | implementation (just return 404). This auto generates the
           | spec.yaml as well as any vendor code we might need (via
           | client generator). I think this is quite a productive
           | workflow as well because the type generation in code is more
           | convenient than typing yaml by hand and everything is always
           | in sync
        
             | anttiviljami wrote:
             | The code first approach is surely enticing and miles better
             | than manually keeping the openapi spec up to date.
             | 
             | But I'd always advocate for going schema first. This has
             | huge benefits for collaboration between frontend and
             | backend engineers and results in better designed APIs and
             | generally better software in my experience.
             | 
             | Wrote a full blog post some time ago explaining why the API
             | First approach works: https://dev.to/epilot/why-we-design-
             | apis-first-e85
        
             | barefeg wrote:
             | Maybe I didn't explain the process correctly, we do
             | generate the spec first, it's just that the tool we use for
             | creating the spec is the code that will later contain the
             | implementation.
        
               | anttiviljami wrote:
               | Ah nice! Mind sharing what you're using to generate the
               | spec?
        
       | i_like_robots wrote:
       | Congrats, this looks really nice! I recently finished a side
       | project using Fastify and the Fastify Swagger plugin (which
       | extends the built-in request and response validation and can
       | dynamically generate an Open API definition) which was a good
       | experience overall but the addition of request mocking and the
       | solid documentation site shown here could tempt me to revisit it.
        
         | anttiviljami wrote:
         | Cheers! Going from code first to schema first is definitely
         | worth it in my experience! Especially when working in a team.
         | 
         | The nice thing is you already have an openapi spec, so it's
         | pretty trivial to eject from fastify swagger and switch to
         | openapi-backend if you want!
         | 
         | Here's an example of openapi-backend running on Fastify
         | 
         | https://github.com/openapistack/openapi-backend/tree/main/ex...
        
       | zabil wrote:
       | We're pretty pleased with using trpc. With trpc-openapi, you can
       | set up REST-like APIs. I like this method because it uses
       | TypeScript and not YAML.
        
         | anttiviljami wrote:
         | Love tRPC! For full stack typescript teams it's the obvious way
         | to go. Super simple and straightforward. OpenAPI or GraphQL are
         | great though if you're investing into APIs as a product
        
       | jayy-lmao wrote:
       | After looking at tRPC, and having done a lot in a few jobs with
       | GraphQL codegen & gRPC codegen, I always wondered why there were
       | so few recent OpenAPI based codegen/client-server-contract tools.
       | I think I was searching for this exact tool.
       | 
       | Love that it makes the client somewhat backend agnostic, but the
       | tools for the OpenAPI backend also look great.
       | 
       | Thank you for this, I hope it is successful in achieving some
       | adoption!
        
         | anttiviljami wrote:
         | Thanks for the encouraging words! So far it's already nice to
         | see these libraries being adopted slowly by more and more
         | companies. Not nearly as big as graphql and trpc of course.
        
       | ericls wrote:
       | GraphQL is RESTful. Just treat GraphQL Result as the resource..
        
       | jensneuse wrote:
       | > Many organizations choose REST over GraphQL due to more
       | established conventions, simplicity, and the ability to leverage
       | standard HTTP features directly.
       | 
       | I strongly disagree with this. REST APIs are usually a complete
       | mess and follow no conventions at all. Even if OpenAPI is being
       | used, the majority of OAS documents have errors or are entirely
       | broken. I'm Working on tooling to automatically parse OAS and
       | transform it to GraphQL schemas. There's not a single day where
       | we don't find another broken OAS. Compare that to GraphQL where
       | we now have powerful linters for schemas etc... But even without,
       | the average GraphQL API is definitely in better shape than the
       | average REST API, and that's simply because the tooling enforces
       | better boundaries. You might have a correct OAS vs every GraphQL
       | server actually follows the GraphQL spec.
        
         | anttiviljami wrote:
         | > The average GraphQL API is definitely in better shape than
         | the average REST API
         | 
         | Totally agree.
         | 
         | GraphQL tooling is generally just better. It enforces a Schema
         | first workflow and thus more emphasis on conventions and
         | design.
         | 
         | OpenAPI tends to be an after thought with teams building REST
         | APIs. Swagger started out as a way to add docs and generate
         | SDKs.
         | 
         | That was exactly my motivation for building openapi-stack.
         | GraphQL-like tooling, but for teams using REST.
        
           | jensneuse wrote:
           | That's fantastic and I hope to see more of this.
        
         | [deleted]
        
       | brodouevencode wrote:
       | I want this, but language agnostic.
       | 
       | Let me explain: standards are great, type safety is great, API
       | contracts are great. Locked into a particular language is not
       | great. In fact it's bad for the author. tRPC and now this assume
       | my team has the desire and time to move to another language. The
       | best frameworks assume none of that.
       | 
       | I'm not asking for implementations for every possible language
       | given a framework. I'm asking for a framework for which any
       | possible language can be built upon because the constructs are
       | simple and easy to follow: graphql does this pretty well despite
       | some of the nuances. Bonus points if the author provides examples
       | out of the box in a variety of languages.
        
         | stetrain wrote:
         | There are libraries out there for a lot of languages that can
         | generate OpenAPI specs for your APIs and generate clients from
         | OpenAPI specs.
         | 
         | This seems like a nice set of tools for doing so in
         | Node/Typescript but the general pattern of using OpenAPI
         | contracts is language agnostic.
        
           | brodouevencode wrote:
           | The difference being that each language-specific framework
           | has their own way of implementing the specs with the problem
           | that some are done well and some are done half-assed. But
           | then again, this problem exists with many specifications
           | (OpenAPI is not alone). I look at it like this: the spec
           | should inform the framework which should inform the (language
           | specific) implementation. If the language specific
           | implementation is it's own framework then so be it, but
           | counter to the intentions of the layer above it. So why do
           | all this? Enterprises have many teams that have many
           | capabilities. How one (Python) team implements OpenAPI is
           | drastically different than how another (Typescript) team
           | implements OpenAPI, which causes a lot of friction when
           | moving engineers around to different teams. If a spec desires
           | to have mass adoption then providing at least heuristics for
           | implementation will only increase that adoption.
        
       | djha-skin wrote:
       | > While REST APIs don't generally provide the same level of
       | control to clients as GraphQL, many times this could be seen as a
       | benefit especially in scenarios where strict control over data
       | access and operations is crucial.
       | 
       | REST is more secure, cacheable, and more performant on the server
       | side as field resolution doesn't need to happen like it does with
       | GraphQL. I'm told it is easier to develop against on the client
       | side, and this is a trade-off, but I favor REST applications over
       | GraphQL ones as a DevOps engineer. They are much easier to
       | administer infrastructure-wise. I can cache the requests, I don't
       | need to stand up an Apollo router, and WAF support for GraphQL is
       | still pretty nacent. My coworker found a GraphQL query only about
       | five layers deep that could tip over a service. Please don't put
       | cycles in your graphs.
       | 
       | Data at our company suggests that several small requests actually
       | do better performance-wise than one large one. We switched to
       | GraphQL a year and a half ago or so, but this piece of data seems
       | to suggest that we might have been better off (performance wise
       | on the client side) just sticking with REST. My suggestion to
       | that effect was not met with optimism either on the client or
       | server side. Apparently there are server-side benefits as well,
       | allowing for more modular development or something like that.
       | 
       | I have used OpenAPI using connexion[1]. It was hard to understand
       | at first, but I really liked that the single source of truth was
       | one schema. It also made it really easy to develop against the
       | API because it came with a UI that showed the documentation for
       | all the REST end points and even had test buttons.
       | 
       | 1: https://connexion.readthedocs.io/en/latest/
        
         | datadeft wrote:
         | I concur. I usually implement a specific rest resource for use
         | cases which is usually easier to do than implement a GraphQL
         | backend.
        
         | SkyPuncher wrote:
         | > My coworker found a GraphQL query only about five layers deep
         | that could tip over a service.
         | 
         | I find arguments like this a bit odd. That's a pretty deep
         | query in REST as well.
         | 
         | I don't have extensive experience with GraphQL, but the
         | complaints I see about it often seem like things you just
         | shouldn't be doing anyways - or, if you do, they're going to be
         | rough in REST as well.
        
           | anttiviljami wrote:
           | I think the point is, graphql apis tend to be so flexible
           | that it's easy to accidentally ship an API that allows
           | clients to craft excessively heavy nested queries in a single
           | request.
           | 
           | Supporting nested queries isn't really a common thing in
           | REST, and it's simpler to rate limit clients by resource than
           | query complexity.
        
         | [deleted]
        
       ___________________________________________________________________
       (page generated 2023-10-10 23:01 UTC)