Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Well, I would argue with "true" REST, all of your REST routes are specific, and generally therefore easy to optimize.


Why would your routes with REST magically be specific and your queries with GraphQL not?


REST endpoints typically return a specific set of data that you can optimize queries for. Whereas the GraphQL endpoint must handle arbitrary queries which will require some logic to prevent N+1 queries on the related tables or even resolve to other data sources.


REST endpoints typically return data I don't need. For example, the twitter REST API `/1.1/users/show.json?screen_name=twitterdev` it will show me the last tweet for the user. Presumably this involves perhaps waiting for tweet service when the client may not even want the tweet. A GraphQL client can be more explicit about what edges to select.


There are specs like jsonapi that solve this problem. I’ve never been entirely convinced that GraphQL is better than actual REST, even if it’s better than most of the APIs people call RESTful


JSON:API provides some of the same functionality as GraphQL, like specifying which fields and nested resources you want, but at that point you’re going to have the same problems with ensuring good performance with any combination of included fields and relationships.


I don’t disagree: I tend to find REST + openapi codegen a more compelling developer experience then yet another query DSL.


> even if it’s better than most of the APIs people call RESTful

I feel your pain.


Yes, the advantage of a GraphQL endpoint is you can ask for a variety of things and the tradeoff is potential performance issues for unforeseen queries doing N+1s or something.

If you control the API and know all the use cases for a REST endpoint, the advantage is predictable performance characteristics and the tradeoff is flexibility.

It all depends on what you need (and maybe what tools you're using to mitigate GraphQL resolver problems).


> REST endpoints typically return a specific set of data that you can optimize queries for

You mean when someone creates a REST API he magically knows in advance how it will be used and writes a bunch of specific, optimized endpoints and queries such as "/magic-endpoint/" which returns 20 blogposts with their comments?

I don't think so. And even if that were true, the same could easily be done with GraphQL.


It's not magic, you would design it in advance so you know what you're querying by and what you're returning in the payload. Typically you'd probably separate it into two endpoints `/blogposts` and `/blogposts/:id/comments`, but there are many ways to approach the problem. These days JSON:API is pretty popular for creating standard interfaces.


> It's not magic, you would design it in advance so you know what you're querying by and what you're returning in the payload

Where is the difference to GraphQL then? If you know in advance what will be queried then you can create an optimized query for it.


> Where is the difference to GraphQL then?

GraphQL allows ad-hoc queries of unlimited complexity and recursion

> If you know in advance what will be queried then you can create an optimized query for it.

No. In general you don't know what will be queried. And that's the reason why most GraphQL implementations end up using just a small predefined set of "persisted queries" (that is, REST with extra steps).


I think you misunderstand. You can write very restricted queries that mirror REST routes 1:1. No need for persisted queries.

Persisted queries enter the game when you define a query that potentially can become very complex and deep and then want to restrict the complexity in specific ways. But that is not required if you just want to mirror a RESTful API.


> I think you misunderstand.

I don't

> You can write very restricted queries that mirror REST routes 1:1. No need for persisted queries.

What stops a frontend developer writing an ad-hoc query?

> Persisted queries enter the game when you define a query that potentially can become very complex and deep

That... That is exactly what I wrote.

---

Honestly, I'm baffled at GraphQL defenders. It's like they never even read the documentation to the tools they defend.

- How is GraphQL different from REST?

- Ad-hoc queries of unlimited complexity

- But you write restricted queries

- No. The whole point of GraphQL is ad-hoc queries

- Persisted queries enter the game when you define a query that potentially can become very complex and deep

- That is exactly what I'm saying

And elsewhere, you can see it in other replies, it's the same story with N+1:

- GraphQL is great!

- Except the issues on the server and trying to handle N+1 queries

- What's N+1?

- It's.... It's a prominent part of the documentation for the frigging tool you use. And the reason for the things you advocate like dataloaders and persisted queries


> What stops a frontend developer writing an ad-hoc query?

What stops them is that the "ad-hoc" query can only look like this:

    articlesWithComments($id) {
      title
      contents
      comment {
        author
        text
      }
    }
That's all. Now the only way to change this query is to remove fields but there is no way to make anything more complex. The only way to do more is to repeat the query. I.e. literally:

    article1: articlesWithComment(1) {
      title
      contents
      comment {
        author
        text
      }
    }
    article2: articlesWithComment(2) {
      title
      contents
      comment {
        author
        text
      }
    }
That will create two queries in the backend - that is the equivalent of just making two requests against the same REST route.

It _is_ possible to allow a user to change the query like this:

    articlesWithComments($id) {
      title
      contents
      comment {
        author {
          name,
          age,
          articles {
            ...
          }
        }
        text
      }
    }
But that is totally optional - you don't have to give your users this power.


> What stops them is that the "ad-hoc" query can only look like this:

What is "author" in that query and why can't the user do

  author {
          name,
          age,
          articles {
            ...
          }
        }
in that query?

And what you're basically saying is: let's create REST with extra steps for no particular reason. With extremely complex setups where author in one query has a different set of fields than in a different query etc.


"author" would be the same as in the REST endpoint. So for example a string.

As for your question, why the user can't change the query (in this example) : because it violates the specifiction and will be rejected by the server.

Does it answer your questions?


So, you're basically proposing to create a poor imitation of REST.

What's the point of GraphQL in this case?


I suggest you to take a step back and re-read the thread. Maybe the context got lost. I replied to the following post:

> https://news.ycombinator.com/item?id=25432655

In particular:

> Its much harder to make an efficient resolver than it is making an efficient REST endpoint.

As I showed, the claim is not true because it can be solved in the same way in both GraphQL and REST.


> I suggest you to take a step back and re-read the thread. Maybe the context got lost.

I've read the thread. And no, the context wasn't lost.

The whole point of GraphQL is flexible queries. And it is harder to make an efficient resolver in GraphQL than it is in REST.

And yes, your solution (and the solution everyone ends up arriving at) is reimplementing REST in GraphQL, poorly. Precisely because it is much harder to make an efficient resolver in GraphQL.


I think I have proven my point and I'm not eager to discuss additional topics about GraphQL in this subthread.




Consider applying for YC's Fall 2025 batch! Applications are open till Aug 4

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: