System Design

HTTP QUERY Method Explained: Why RFC 10008 Could Change REST APIs Forever

Learn everything about the new HTTP QUERY method (RFC 10008), why it exists, how it compares to GET and POST, current adoption, .NET and Laravel support, and when you should use it.

M
Md Shayon
10, Jul 2026
8 minutes read
1050 views
HTTP QUERY Method Explained: Why RFC 10008 Could Change REST APIs Forever

For more than 16 years, the HTTP ecosystem remained remarkably stable.

After PATCH became an official HTTP method in 2010, developers simply accepted one awkward reality: there was no proper HTTP method for sending complex, read-only queries.

When search filters became too large for a URL, developers quietly switched to POST—even though POST was never designed for read-only operations.

That long-standing compromise has finally ended.

In June 2026, the Internet Engineering Task Force (IETF) officially published RFC 10008, introducing HTTP QUERY—the first standardized HTTP method since PATCH. It combines the flexibility of POST request bodies with the safety and semantics of GET.

Although ecosystem support is still in its early stages, QUERY represents one of the most meaningful improvements to REST API design in years.

Key Takeaway

HTTP QUERY solves a problem developers have worked around for over a decade: performing complex, read-only searches without abusing POST or overloading GET URLs.

Why GET Was Never Enough

For simple APIs, GET works beautifully.

GET /products?category=books&page=2

The problems begin once applications grow.

Modern APIs frequently need:

  • Multiple filters

  • Nested conditions

  • Arrays

  • Sorting

  • Pagination

  • JSON-based search criteria

  • GraphQL-like filtering

  • SQL-inspired query languages

Eventually, URLs become monsters.

GET /orders?filter[and][0][price][lt]=30&filter[and][1][status]=active...

These URLs aren't just ugly.

They introduce several real technical problems.

Practical limitations of GET

  • URL length limits – Browsers, proxies, and servers often impose URL length limits (commonly several KB, with many environments around 8 KB).

  • Difficult encoding – Special characters, arrays, and nested structures require complex URL encoding.

  • Poor readability – Large query strings become difficult to read, debug, and maintain manually.

  • Logging exposure – Query parameters are frequently recorded in server logs, analytics platforms, and monitoring tools.

  • No standard structure – Arrays and nested objects are represented differently across frameworks, leading to inconsistencies.

  • GET remains the best choice for simple filtering and retrieval.

  • ⚠️ For advanced or complex searches, its limitations become more apparent.

Why GET With a Request Body Never Worked

Many developers have asked the obvious question:

"Why not simply send JSON in a GET request?"

Unfortunately, HTTP never standardized semantics for GET request bodies.

Different clients behave differently:

  • Some ignore the body.

  • Some strip it.

  • Some reject the request entirely.

  • Some proxies never forward it.

Because of this inconsistent behavior across browsers, firewalls, proxies and servers, GET bodies are considered unreliable for production APIs.

Changing GET itself wasn't realistic because it would break decades of existing infrastructure.

Instead, the standards community chose a different path.

They created a brand-new HTTP method.

Why POST Was Always an Imperfect Workaround

Most APIs solved the problem by switching search endpoints to POST.

POST /products/search

{
  "category": "books",
  "price": {
    "lt": 30
  }
}

Technically, it works.

Semantically, it's wrong.

POST indicates that the client wants the server to perform processing that may change state.

A search request usually doesn't.

That distinction matters more than many developers realize.

What is idempotency?

An operation is idempotent when executing it multiple times produces the same effect as executing it once.

Examples:

✅ GET /users/42

Repeated requests always return the same resource.

✅ QUERY /products

Running the same search multiple times is safe.

❌ POST /users

Running it twice creates two users.

Why POST causes problems

Because POST is not idempotent:

  • Automatic retries become risky.

  • HTTP libraries hesitate to replay failed requests.

  • Proxies cannot safely retry them.

  • Caching becomes significantly more complicated.

  • The HTTP semantics no longer accurately describe the operation.

Developers have spent years inventing concepts like "safe POST" simply because HTTP lacked a better option.

Meet HTTP QUERY (RFC 10008)

QUERY is remarkably simple conceptually.

Think of it as:

GET + Request Body

The request body contains the search definition.

The HTTP semantics remain those of a safe, read-only operation.

Example:

QUERY /products/search

Content-Type: application/json

{
  "category": "books",
  "price": {
    "lt": 30
  },
  "sort": [
    "-published",
    "title"
  ],
  "page": {
    "size": 20
  }
}

The server simply returns matching results.

No state changes.

No semantic compromises.

GET vs POST vs QUERY

  • 🟢 GET

    • ✅ Safe

    • ✅ Idempotent

    • ❌ Supports request body

    • ✅ Cacheable by default

    • ✅ Safe automatic retries

    • ⚠️ Best for simple searches only

  • 🟠 POST

    • ❌ Not safe

    • ❌ Not idempotent

    • ✅ Supports request body

    • ⚠️ Cacheable only with explicit support

    • ❌ Automatic retries are not safe

    • ⚠️ Common workaround for complex searches

  • 🔵 QUERY

    • ✅ Safe

    • ✅ Idempotent

    • ✅ Supports request body

    • ✅ Cacheable by default

    • ✅ Safe automatic retries

    • ✅ Designed specifically for complex searches

What Makes QUERY Different?

QUERY isn't simply "POST for searches."

It introduces several important semantic guarantees.

1. Safe

A QUERY request promises not to modify server state.

That allows infrastructure to treat it similarly to GET.

2. Idempotent

If a network connection drops halfway through a request, clients may safely retry it without worrying about duplicate side effects.

This is particularly valuable for:

  • Microservices

  • Cloud APIs

  • Distributed systems

  • Automatic resilience frameworks

3. Request Body Support

Unlike GET, QUERY officially defines semantics for request bodies.

Bodies may contain:

  • JSON

  • GraphQL

  • SQL

  • JSONPath

  • XML

  • Custom query languages

The media type is determined through Content-Type, which is mandatory.

4. Better Caching Potential

QUERY responses are cacheable under HTTP semantics.

However, caches must incorporate the request body into the cache key.

This is far more complex than traditional GET caching, which is one reason widespread implementation will take time.

Important HTTP Details Developers Should Know

RFC 10008 defines several implementation requirements that make QUERY predictable.

Required Content-Type

Every QUERY request should specify a media type describing the query language.

Missing or invalid Content-Type should result in an error.

Content-Location and Location

One interesting capability introduced by the RFC is the ability to associate queries or results with URLs.

Two related ideas often appear in discussions:

  • Content-Location can identify a resource representing the returned result.

  • Some implementations may expose a persistent URI representing the query itself, allowing the same search to be rerun later without resending the original request body.

This enables scenarios such as:

  • Bookmarking searches

  • Sharing queries

  • Periodically rerunning saved searches

  • Building richer caching strategies

Because implementations are still emerging, exactly how these URIs are exposed may vary.

Current Framework Support

Although RFC 10008 is now standardized, software support is still catching up.

Some frameworks have already moved surprisingly quickly.

.NET 10

Microsoft is among the earliest adopters.

Client support includes:

HttpMethod.Query

Server-side support includes:

  • HttpMethods.Query

  • HttpMethods.IsQuery()

Minimal APIs can register QUERY endpoints using:

MapMethods(...)

Convenience helpers like MapQuery() and [HttpQuery] were proposed but intentionally omitted from .NET 10. Developers can easily create small extension methods to fill the gap.

Another notable detail is resilience.

Because .NET understands QUERY is idempotent, retry mechanisms integrate naturally with existing HTTP resilience libraries.

Testing Helpers

  • query()

  • queryJson()

These mirror the existing helper methods for POST, PUT and DELETE, making QUERY feel like a first-class citizen inside Laravel applications.

Laravel 13.19 also introduced unrelated improvements, including:

  • reduceInto() for collections

  • counted() string helper

  • Batch SQS dispatch improvements

  • Queue inspection enhancements

Browser Support Is Still the Biggest Obstacle

This is where reality catches up with the specification.

Although QUERY is standardized:

  • Browsers currently do not reliably support QUERY via Fetch or XHR.

  • Many proxies still treat unknown HTTP methods cautiously.

  • CDNs are only beginning to consider QUERY-aware caching.

  • OpenAPI 3.1 has not yet standardized QUERY, meaning some tooling excludes these endpoints from generated API specifications.

Framework support is arriving faster than browser support.

That means QUERY currently shines most in server-to-server communication, where both client and server are under your control.

When Should You Use QUERY?

The answer depends entirely on your audience.

Excellent use cases

✅ Internal microservices

✅ Enterprise APIs

✅ Cloud-native service communication

✅ Complex search endpoints

✅ Analytics APIs

✅ Report generation

Stick with GET when

  • Filters are simple.

  • URLs remain readable.

  • Users need bookmarkable links.

  • Browser compatibility is essential.

Keep POST when

Public browser clients cannot yet send QUERY.

Many organizations will likely expose both:

  • QUERY for internal services

  • POST as a compatibility fallback

This dual-endpoint strategy allows gradual adoption while remaining compatible with existing clients.

Who Created QUERY?

QUERY emerged from the IETF HTTP Working Group (HTTPbis) after years of discussion.

The RFC was authored by respected figures in HTTP infrastructure, including contributors from:

  • Cloudflare

  • Akamai

Their involvement is significant.

Companies operating global CDNs understand better than almost anyone how important standardized caching semantics are for modern APIs.

Final Thoughts

HTTP QUERY may look like a small addition to HTTP, but it solves one of REST's oldest design compromises.

For years, developers had to choose between:

  • GET with increasingly unmanageable URLs, or

  • POST with incorrect semantics.

QUERY finally removes that trade-off.

It provides the request body flexibility developers need while preserving the guarantees that make HTTP reliable: safety, idempotency, cacheability, and replayability.

The ecosystem still needs time to catch up. Browsers, proxies, CDNs, and API tooling will gradually adopt the standard over the coming years. But framework support has already begun, and service-to-service architectures can benefit today.

Like PATCH before it, QUERY won't transform the web overnight. Yet as APIs continue to grow more sophisticated, RFC 10008 may eventually become one of the most important HTTP standards introduced in the past decade.

Resources

Video Tutorial

Step-by-step guide

Watch Tutorial

Source Code

Complete project

View Repository

Need Help?

Let our experts bring your project to life with professional development services.

Custom Development
Security & Performance
Explore Services

Tags

HTTP QUERYRFC 10008REST APIHTTP MethodsBackend Development

Related Articles

Continue your learning journey

Frontend8 min

Advanced State Management with Pinia in Nuxt.js

Learn how to implement scalable state management in your Nuxt.js applications using Pinia.

Read more
Backend12 min

Building RESTful APIs with FastAPI and SQLAlchemy

Create high-performance REST APIs with automatic documentation using FastAPI and SQLAlchemy ORM.

Read more
DevOps10 min

Deploying Full-Stack Applications with Docker and CI/CD

Complete guide to containerizing and deploying your applications with automated pipelines.

Read more

Discussion (6)

SA
JD
John Doe3 hours ago

This is exactly what I needed for my current project. The delta-time compensation trick for auto-scroll is brilliant — I've been fighting a similar bug for days.

2 replies
AM
Alice Morgan2 hours ago

@John Doe Thanks! I completely agree with your point. The RAF loop guard was the missing piece for me too.

BC
Bob Chen1 hour ago

@John Doe Same here, saved me a full afternoon of debugging.

PN
Priya Nair7 hours ago

Great write-up. Would love to see a follow-up on virtualizing large sortable lists — performance starts to dip past a few hundred items in my experience.

1 reply
MR
Michael Ross5 hours ago

@Priya Nair Seconding this — pairing it with a virtual scroller would make for a great part two.

DF
Diego Fernandez1 day ago

Clean explanation. Bookmarking this for the next time I touch SortableJS.