7 ms·
The new HTTP QUERY method explained
- hparadiz 3mo ago[flagged]
- flanked-evergl 3mo agoNo, it does not feel like that.
- hparadiz 3mo agoMy framework is already two decade old prior art and you still haven't actually convinced me that this RFC solves a problem.
- rmunn 3mo ago1. Sometimes you need a request body. 2. POST cannot be guaranteed to be safe if re-sent. 3. This is GET with a request body, guaranteed* to be safe if re-sent. * With the caveat that it's only guaranteed if the server is following the RFC correctly.
- LaGrange 3mo agoI will keep using POST and not some weird thing that isn’t supported by a proxy living in the basement of a shoe store in Wageningen or whatever.
- PunchyHamster 3mo ago> POST cannot be guaranteed to be safe if re-sent. It can absolutely be guaranteed. What it can't be is communicated to be safe so browser gonna ask its silly question
- broken-kebab 3mo agoYou can guarantee it to yourself, sure, but the talk is about different guarantees, those which are implied by people who has no idea about your plans and opinions but whose software may interact with yours.
- hparadiz 3mo agoI read the RFC front to back. It is lazy. To the point where I'd be embarrassed to even show it to people. For one you would never allow a client to dictate the query. That is a security and validation problem. So you have to deconstruct the query anyway and then rebuild it. That's HTTP APIs 101. Now if the authors of this RFC knew what they were doing they could enforce trust with some sort of JWT like trust mechanism but no they don't bother to define ANYTHING like that. Instead and I will quote this for completeness because it's honestly one of the funniest things I've ever read in an RFC. > 4. Security Considerations > It can be used as an alternative to passing request information in the URI (e.g., in the query component). This is preferred in some cases, as the URI is more likely to be logged or otherwise processed by intermediaries than the request content. In other cases, where the query contains sensitive information, the potential for logging of the URI might motivate the use of QUERY over GET. This. This is just plain baffling to me. The argument is that QUERY replaces GET (it doesn't) so let's shove data into the same place that POST already does because it MAY MAY be logged. Bro the people doing the logging are logging the entire damn thing URI, Header, and Body. What even is this. And again if they knew their shit they would know that GET has a soft cap of 2,083 characters from the internet explorer days so no one shoves more than that into a url for compatibility and if they do they risk losing data so they use POST anyway. Heck my framework even does JSON post bodies in the POST. And again if you are writing an RFC do your research and use this technical fact as an advantage. Define your own limits and explain why based on existing methodology. It would actually give your RFC some weight. It doesn't even bother to address query feedback errors like what if the disk says no and writes are locked. Frankly...... I miss the old days when RFCs where measured in pounds of paper.
- flanked-evergl 3mo ago> For one you would never allow a client to dictate the query. That is a security and validation problem. So you have to deconstruct the query anyway and then rebuild it. Every single SQL server allows a client to dictate the query. Furthermore, not all queries are SQL queries.
- hparadiz 3mo ago[flagged]
- ktpsns 3mo agoHTTP QUERY was discussed many times in the past here: https://news.ycombinator.com/item?id=48568502 https://news.ycombinator.com/item?id=48568502 (4d ago, 173 comments) https://news.ycombinator.com/item?id=29794838 https://news.ycombinator.com/item?id=29794838 (4y ago, 125 comments)
- TheLudd 3mo agoYes but the author wants to promote his postman replacement
- koolala 3mo agoWhat do you think people will make the Query request body? Most everything will use this for JSON but it could be anything so what other interesting things do you think will go in there? Query 1 + 1 and get 2?
- dreambigwrkhard 3mo agoI'm curious too. Unless the developer is really passionate about this I don't think a dev will risk (potential) compatibility issues or unexpected footguns to use this when the workarounds do seem to work quite well already. I just dont see the benefit but maybe it's because I am just not aware of a real world use case; happy to be corrected.
- unilynx 3mo agoElastic/Opensearch uses GET requests with a body for search, which is complicated or forbidden (not exactly sure) with the HTTP spec. Not all HTTP clients are willing to submit a body with a GET. So opensearch also allows you to POST search requests, but those are uncacheable QUERY would fit here perfectly - it's probably trivial for opensearch to add but it will take some time for clients to catch up.
- topham 3mo agoFixing GET would be easier. And yes,it would be fixing a flawed interpretation of what should be implemented.you are, by definition GETting something. Tools dropping body from GET by default are violating the spec today. Rules configured to drop it are just that, temporarily configured constraints readily modified. Adding QUERY will make it unpredictable in effectively the same manner as GET/body. It'll take even longer to resolve it though.
- Yokohiii 3mo ago> Fixing GET would be easier. I disagree. I think the adoption (or dismissal) of QUERY will show. First thing that comes to mind is that the idempotency of GET resources are easy to handle. URL's have a fixed size, they can be efficiently hashed, cached and are unambiguous about how they serve this purpose. It is unclear how the ecosystem will deal with the QUERY requirements. It's easy for apps, but browsers, http caches and servers will take some time to figure out solutions. Fixing GET would have the same amount of uncertainty in addition to the need to keep current expectations valid. It's not easier, it's harder.
- 8-prime 3mo agoIt's interesting to see additions to HTTP methods as it much feels like the existing ones are set in stone. At least for the time that I have been a developer. I'm curious to see how fast the adoption/support for HTTP QUERY will be. I've had my fair share of situations where I wished for something like HTTP QUERY.
- hparadiz 3mo agoI can implement it in about 10 minutes. Not even kidding.
- echoangle 3mo agoIn what role? As a user writing client code or when implementing the caching middleware or the Webserver?
- PunchyHamster 3mo agozero. Many libs will/can just request method as a string so you can start coding now > I've had my fair share of situations where I wished for something like HTTP QUERY. Using POST instead comes with no drawbacks
- rezonant 3mo agoI think the article summarizes pretty well what the drawbacks of POST are: unclear idempotency (well it's actually pretty damned clear: they are not cacheable). That complicates caching logic, and that's not just for the application server itself, but any reverse proxies in front of it as well as the user agent itself. I'm not sure QUERY is a great solution, because in the context of a web application absolutely no one enjoys using a page that does not keep its state on refresh, so that really limits where QUERY makes sense, but if you have a case that is not driven by navigation, great.
- tosti 3mo ago> using HTTP GET with a request body is a bad idea, as for example users behind a corporate firewall or a different browser may be unable to use your website. So is using QUERY requests for quite some time from now.
- jbverschoor 3mo agoYeah, query seems just GET with a body. No difference in protocol nor behavior
- ComodoHacker 3mo agoExcept compatibility. If you're using classic GET and it's enough for you, you aren't affected.
- 4gotunameagain 3mo agoWhat is compatible with a QUERY but not with a GET ?
- dotancohen 3mo agoIntermediate proxies, caches, CDNs, firewalls, and load balancers.
- 4gotunameagain 3mo agoThat is only in the case of GET with a body though.
- dotancohen 3mo agoYes. That is the issue under discussion, e.g. not "classic GET".
- gl-prod 3mo agoThe difference is the method. Query you're saying I can use body. GET you should never use body.
- doctor_phil 3mo agoNice, not having bodies on GET has been a pet peeve of mine for a long time. It would be nice to allow bodies on DELETE as well, but that is less of a problem in most cases.
- ralferoo 3mo agoIf you're doing anything complicated enough to need so much data that it'd be better to send the data in a body, it's probably not a DELETE and so POST would be more appropriate anyway. DELETE is intended to delete one specific object, pointed to by a unique URL, not to delete arbitrary objects matching some criteria.
- beardyw 3mo agoDELETE is idempotent, so I am not sure what the body would do?
- nokeya 3mo agoIf it needs so much explanation and discussion, maybe it is not a great idea after all?
- reddalo 3mo agoThe article describes the current situation first. The whole explanation is quite simple: QUERY requests are the same as GET, but they have a body.
- someguynamedq 3mo agoSo just add an optional body to get
- dxdm 3mo agoThe article also addresses why this is not the chosen solution. It's pretty much the first one you'd think of: all kinds of existing software (that can be between client and server and out of their control) already handle GET bodies in all kinds of incompatible ways, because the existing standard says they're meaningless and "shouldn't" be included. The idea is to not break people's stuff, so they don't rugpull the established standard. There's usually a reason why the simplest solution that pops into one's head is not "just" used by the people who put a lot more thought into it. Not always, but it can be useful to try to come up with it.
- topham 3mo agoSo, I need to update all the tools to support QUERY, or I need to update all the tools to support GET/body. So, either way, I need to update all the tools. Just fix GET.
- Ghoelian 3mo agoThe point is that if you do that, you end up with lots of undefined behaviour in existing software that has not been patched yet. If you make it a whole new request method, existing unpatched software should just respond with "Method not allowed".
- waweic 3mo agoI wonder what the drawbacks of standardizing a GET body would have been. CoAP already has it (which creates friction in building CoAP<->HTTP proxies). All in all, I dislike the overall focus on the HTTP method when designing "RESTful" interfaces. If all we're building is, effectively, an RPC, why would the cacheability meta-information be the first thing we specify?
- braiamp 3mo agoA absolute swats of middle boxes that will not get addressed ever. As industry, it's preferable to create something that is a hard break and makes players upgrade and give people a feature to argue for said upgrade
- acimen101 3mo ago[flagged]
- grugdev42 3mo agoWe should have just added optional body support for GET requests. So much simpler...
- ComodoHacker 3mo agoMore complex actually
- tumetab1 3mo agoThe only valid argument against HTTP GET with a body is that it has privacy/security risks. Exist stuff (caches, CDN, etc.) could serve private information because the HTTP GET is cached without checking the request contents. The new standard can avoid this because old stuff does not know about HTTP QUERY.
- Rapzid 3mo agoBody is already optional with GET. Proxies aren't supposed to touch it or assign meaning to it; it's between the client and the end server. A whole new method whose semantics don't really fit with the others is.. An odd way forward.
- thewisenerd 3mo agosemantics become extremely relevant when "proxies" start caching.
- Rapzid 3mo agoA lot of the RFCs are flavored by the lack of https and prevalence of forward proxies run by the ISPs to improve perceived speed and reduce their network loads.. Back in the day. By my estimation, that's why they explicitly call out only the client and origin can know what a GET body means; proxies should forward as-is and ignore. Those days of ISP forward http proxies are gone, but those semantics are still fine; the body means what the origin and client agree it means.
- juliangmp 3mo agoYeah I always disliked that there's this idea that you can't put a body on a GET request. Iirc openapi generators goes out of its way to not support that which has lead to me writing a small rant into an API specification before to explain why the get_xyz uses POST...
- CommonGuy 3mo agoProxies are allowed to drop bodies of HTTP GET requests. RFC 9110 states: > [..] content received in a GET request has no generally defined semantics, cannot alter the meaning or target of the request [..] > A client SHOULD NOT generate content in a GET request [..]
- magicalhippo 3mo agoEven HTTP 1.0 RFC[11] is fairly clear on this, although it doesn't explicitly spell it out like RFC 9110. GET requests should only consider the Request-URI and request bodies should only be included if the method calls for it. [1]: https://www.rfc-editor.org/info/rfc1945/ https://www.rfc-editor.org/info/rfc1945/
- IshKebab 3mo agoWhat are the chances sites start using this to prevent sharing links...
- ramon156 3mo ago"QUERY is just GET" "Using GET with a Body works" Seems like this is going everyone's head. You're not supposed to use GET with a Body, this is a hack, therefore having an explicit method makes sense. Just because it works, doesn't mean its the right way
- dotancohen 3mo ago> Just because it works, doesn't mean its the right way Tell that to anybody in the business long enough to decipher someone else's Perl!
- nixon_why69 3mo agoIt's possible that the slogan "There's one obvious way to do it" as a riposte to "There's more than one way to do it" was more responsible for Python's first wave of success than anything else.
- ivanhoe 3mo agoHey, remember what Larry said, there's more than one way to do things ;P
- ronbenton 3mo agoI’ve seen a framework strip body content off GET requests, so doing hacky things doesn’t even always work. The QUERY method is a welcome addition
- pdpi 3mo agoInsofar as I'm concerned, a GET request with a body is an attack-shaped aberration. E.g. Somebody who's trying to get me to mix up validating query string parameters and request body parameters. Hacky things not working is a feature, not a bug.
- psychoslave 3mo agoIs the stripper service in question already implementing it?
- marc_vuit 3mo agonice man
- _alphageek 3mo ago>> QUERY request can be cached I have a weird feeling. Query body is encrypted by https. So CDN will not be able to cache results. In order to make it work right - whole topology of the internet should be redone. Caching on the backend server will not give any real gains for large scale apps.
- CodesInChaos 3mo agoThe whole connection is encrypted by https, the request body is treated the same as the url, the headers or the response. The only unencrypted parts are the IP addresses/ports and the domain name (if SNI without ECH is used). CDNs already terminate TLS connections so they can cache GET requests.
- rileymat2 3mo agoI think a lot of people don’t know the http/1.x protocol from url (header) to body is a stream of text* separated by \r\n. * the body may be compressed.
- vshulcz 3mo agoEven past the TLS point (CDNs terminate TLS, so they can read the body) there's a harder problem nobody's solved: to cache a QUERY the cache has to fold the body into the cache key, and there's no standard way to canonicalize a request body. {"a":1,"b":2} and {"b":2,"a":1} are the same query and two different cache entries; whitespace, float formatting, unordered keys all fork the key. GET gets this for free because the URL is already a normalized string. So "cacheable in principle" is real, but "actually cached" needs every layer to agree on a canonical form first - the same coordination problem that killed GET-with-body. I want QUERY for the honest semantics; I just wouldn't budget for cache hits yet
- CodesInChaos 3mo agoI think the simple approach of using a bitwise comparison will result in satisfactory caching for most applications.
- restful2 3mo agoThis breaks rest/crud.
- UnfitFootprint 3mo agoIs it not just READ? As for rest, why?
- bazoom42 3mo agoHow so?
- tumetab1 3mo agoIt can actually improve because the semantics which currently are weird, GET is used for Search (Query), listing and also Get resources.
- Garlef 3mo agoSo what? This is about HTTP. And it does not break REST: None of the HTTP constructs that REST is built on change due to the introduction of QUERY. Yes: If you're doing QUERY, you're (potentially) not doing CRUD. But this enables a clean way to do CQRS over HTTP.
- lightningspirit 3mo agoHow does this break rest?
- xxkcd 3mo agoDon’t add new stuff (query). Instead fix the broken shit that’s already added (get). Sigh. Xkcd standards.
- johnnyevert 3mo agoWill this be compatible with graphql?
- lightningspirit 3mo agoIt won't break GraphQL, as it uses POST. It can very much improve it if adopted: - use QUERY method when querying resources - use POST method for mutations
- mi_lk 3mo agoOK, but stop trying to make fetch happen.
- Asmod4n 3mo agoSlightly off topic Funfact: you can buy a several thousand dollars expensive ssl intercepting proxy appliance which doesn’t support anything beyond http/1.1. Will be fun when those see a whole new http verb, I bet that leads to at least DoS by the track record of that company.
- Stitch4223 3mo agoNot mentioning the vendor… means your comment is true for every vendor :)
- Asmod4n 3mo agoThat would be lancom. Good routers, the rest not so much.
- nness 3mo agoWhat is the use-case for a WAF/proxy/etc. to block unknown HTTP verbs? It feels like a pathway for obsolescence with no actual security benefit?
- Asmod4n 3mo agoNot block, straight out crash the process is my guess will happen here.
- topham 3mo agoIf it crashes it's a security issue. It should adept reject what it does not expect.
- entuno 3mo agoHistorically there have been vulnerabilities in various applications due to HTTP method tampering, and in the days of people accidentally leaving WebDAV enabled then methods like PUT and DELETE could be very damaging. Plus the issues with TRACK and TRACE. Given that most websites only ever use a handful of methods (even once you account for REST APIs using PUT, PATCH and DELETE now), and that list very rarely changes, the WAF developers tend to look at this question from the opposite angle: when you know there are only half a dozen widely used methods, why would you allow anything else by default?
- haburka 3mo agoThis is awesome and very much needed. Sending massive get requests always felt like shit and support for body parsing of GET was all over the place. I hope it will be adopted quickly.
- doginasuit 3mo agoWould this be a defensible decision if the spec were designed today, an additional read method that takes the same argument, entirely for the purpose of not ignoring a specific property? It seems like just the path of least resistance considering all the controversy and legacy tools. That is not a good way to maintain the functionality and long-term relevance of a spec. But if there is a good reason to design it this way from the beginning, I'm curious to know more.
- voiceofunreason 3mo agoMy guess is that if you were building all of this from scratch, you would start with - request-with-a-body - idempotent-request-with-a-body - safe-request-with-a-body because the additional constraints induce properties that are extremely useful to general purpose clients ("I didn't get a reply to my idempotent-request-with-a-body, can I resend it without risking loss of property?") Would someone then come along an introduce safe-request-without-a-body method? After all, we can already meet that "need" with safe-request-with-a-body and content-length: 0. Think rfc-5789::PATCH - mechanically, it's just another request-with-a-body, but with more tightly constrained semantics. But general purpose components can take advantage of the additional properties, and so we introduce a "niche" method with tighter constraints. Document resource manipulation is a common case, so we probably end up with a family of specialized methods, in much the same way that we have a bunch of WebDAV methods.
- WorldMaker 3mo agoThere are good arguments that if you were designing this from scratch it would still make sense to separate GET and QUERY. GET are things addressable purely by URI. QUERY are things that need HTML forms or JS to initiate (but optionally may return GET addressable URLs for future requests). Similarly there are good arguments that if you were designing this from scratch it would make sense to still separate QUERY and POST. To some extent they mean very different things: "search" versus "create"/"do". Some of that is a modern expectation from years of mapping the common "CRUD" concepts to "REST": POST ~= Create; GET ~= Read; PUT ~= Update; DELETE == Delete. But that's a lens that's still useful in designing the thing from scratch even if it wasn't necessarily in mind when HTTP was first designed (especially given the different verbs in HTTP terminology).
- veltas 3mo agoThe other issue with adding a separate supported way to do what people did with GET+body is that we will probably see servers slowly drop support for the GET+body approach when QUERY gets widespread support/usage, and then a ton of other stuff will break. Unless you're really going to improve things or the existing practices are really too painful, standards should follow convention. Even though GET+body is not handled the same everywhere, it's easier to make that the standard than it is to make a new syntax the standard.
- flanked-evergl 3mo ago> Even though GET+body is not handled the same everywhere, it's easier to make that the standard than it is to make a new syntax the standard. Is there some research or study that you base this claim on? What is the reasoning? Can you elaborate?
- veltas 3mo agoWith standards it helps to reconcile existing behaviour, rather than create new unproven syntax. Likewise creating a new syntax for something that already exists means you are just adding to the heap of stuff that needs support on mainstream servers, and as I already said it will probably create compatibility issues as the old deprecated/illegal syntax is removed. This is unnecessary friction. And really what is the advantage of a new syntax? That needs explaining.
- flanked-evergl 3mo agoBut it's not existing behaviour. It does not already exist. Breaking the semantics of something that exists means that things will work inconsistently. Breaking the semantics of get will also create compatibility issues.
- veltas 3mo agoYou might want to read the article.
- sylware 3mo agoThis looks like a effort to inject some planned obsolescence in HTTP more than anything else.
- tndibona 3mo agoGood use case for graphQL requests which use POST for all queries? But then again what about mutations
- WorldMaker 3mo agoPresumably good GraphQL libraries would support requiring POST for mutation and QUERY as acceptable for all queries that don't involve mutation.
- nesarkvechnep 3mo agoI still don't get the need for QUERY. One can create a search or filter resource with a POST request and then query it using GET. As a bonus, creating a resource allows it to be shared and cached.
- theowaway213456 3mo agoObviously the approach you mentioned has the downside of two server round-trips being necessary while the QUERY request only requires a single round-trip. Not to mention the two-request approach adds more complexity to both clients and servers, as it mandates that both the client and server have to physically create and manage those resources.
- nesarkvechnep 3mo agoObviously, yes, but is it simpler to add a new HTTP method and add support for it everywhere?
- lightningspirit 3mo agoBecause HTTP is stateless by definition, you now need to support persistence (state) on the server side whenever you want to run a slightly different query, which contradicts the preamble. I understand the confusion around GraphQL's cached/persisted queries, but this is not the intention of HTTP.
- WorldMaker 3mo agoRight, that process works today just fine, but that's application code that the browser (and middleboxes) can't assume. The idea is that QUERY directly represents that flow to the browser as a direct participant (and to caching middleboxes as well). A QUERY can (optionally) create a search or filter resource and return a Location: response header that points to a GET resource to refresh the next time the same QUERY is asked. The browser can directly cache that Location and associate it with that QUERY body. (So can middleboxes.) A POST can return Content-Location: to the GET resource, but the browser can't assume that the same POST body contents create the same result Content-Location, whereas the QUERY Location represents the QUERY itself as a repeatable object. (Also, QUERY can return Content-Location instead of or in addition to Location for subtly different caching implications.)
- austin-cheney 3mo agoIt blows my mind that people are invested in this. HTTP is a 35+ year old text-based protocol. Its becoming the COBOL of digital transmission. Just as one example, among many, you could try WebSockets (or some other similar protocol) and then push anything over it. Your message could be plain text, JSON, binary, whatever. Web Sockets and protobufs are bidirectional (full duplex) too.
- mekdoonggi 3mo agoWONIBDFI (whether or not it's broke, don't fix it)
- lightningspirit 3mo agoThe internet is complex, and you have tons of protocols that are not well supported. TCP/HTTP are well supported by proxies and have well-defined, stable specs, which also help with caching, throttling, etc. Just because it's old doesn't mean it is worse than alternatives, most likely it is quite the contrary.
- austin-cheney 3mo agoIts worse than alternatives because it imposes greater complexity on everybody that uses it. COBOL is also old. That also does not mean COBOL is bad, but nobody wants to write COBOL any more when there are so many better options available.
- lightningspirit 3mo agoI think we're comparing two very different categories. COBOL is an application language, whereas TCP and HTTP are foundational infrastructure. Replacing a language is challenging, but replacing the infrastructure that underpins most of the Internet is orders of magnitude more complex due to the sheer number of interoperating systems. HTTP accounts for roughly 70-80% of global web traffic, and if you narrow it to TCP-based application traffic, its dominance is closer to 95%. Comparing HTTP to COBOL is a bit like comparing trucks to bicycles...
- 3mo ago
- piterrro 3mo agoI wish there was an HTTP method that directly signals async intent of the server. I know we have 202 Accepted status, but these days there are so many APIs that use the async patterns and each one differs a bit. Having a standard for accepting async jobs with idempotency and notification about results via webhook
- 1vuio0pswjnm7 3mo agoThree different definitions of the hypertext transfer protocol (HTTP). Choose one 1. What the most popular HTTP servers actually accept 2. What the most popular HTTP clients actually send 3. What the RFC "standard" says Personally I choose #1. I don't use the most popular HTTP clients For example, under definition #1, I can do HTTP/1.1 pipelining with POST The RFC "standard" often comes after the software implementation(s); most RFCs document what's already in use on the internet. As the selection of software expands, some competent software authors trying their best still often struggle to conform to RFCs. Go figure To me, the source code of the most popular servers in use is the standard