This question already has an answer here:
- HTTP GET with request body 17 answers
I don't want to see so long parameters string in the URI. So, can GET method use json data?
In my situation, I need to filter the result given kind of parameters. If there are a lot of parameter, the length may exceed the limit of URI. So, is there best practice for this problem?
To answer your question, yes you may pass JSON in the URI as part of a GET request (provided you URL-encode). However, considering your reason for doing this is due to the length of the URI, using JSON will be self-defeating (introducing more characters than required).
I suggest you send your parameters in body of a POST request, either in regular CGI style (
param1=val1¶m2=val2
) or JSON (parsed by your API upon receipt)In theory, there's nothing preventing you from sending a request body in a
GET
request. The HTTP protocol allows it, but have no defined semantics, so it's up to you to document what exactly is going to happen when a client sends aGET
payload. For instance, you have to define if parameters in a JSON body are equivalent to querystring parameters or something else entirely.However, since there are no clearly defined semantics, you have no guarantee that implementations between your application and the client will respect it. A server or proxy might reject the whole request, or ignore the body, or anything else. The REST way to deal with broken implementations is to circumvent it in a way that's decoupled from your application, so I'd say you have two options that can be considered best practices.
The simple option is to use
POST
instead ofGET
as recommended by other answers. SincePOST
is not standardized by HTTP, you'll have to document how exactly that's supposed to work. This is the least RESTful option, but it's fine.The RESTful option, which I prefer, is to implement your application assuming the
GET
payload is never tampered with. Then, in case something has a broken implementation, you allow clients to override the HTTP method with theX-HTTP-Method-Override
, which is a popular convention for clients to emulate HTTP methods withPOST
. So, if a client has a broken implementation, it can write theGET
request as aPOST
, sending theX-HTTP-Method-Override: GET
method, and you can have a middleware that's decoupled from your application implementation and rewrites the method accordingly. This is the best option if you're a purist.