- Proposta de um novo método HTTP,
QUERY
- Um método de requisição seguro e idempotente que pode enviar conteúdo na requisição
- Pode ser usado quando os dados enviados na requisição são grandes demais para serem codificados na URI
- Quando os parâmetros de consulta passam de alguns KB, muitas implementações impõem limites
- Muitas vezes não é possível saber esse limite com antecedência, e a necessidade de codificação torna isso ineficiente
- Por isso, muitas implementações usam
POST em vez de GET para executar consultas
- Porém, sem conhecimento específico do servidor, não é possível saber se isso é seguro e idempotente, então há limitações básicas em comparação com
GET
- O método
QUERY oferece uma solução para preencher a lacuna entre o uso de GET e POST
- Assim como no
POST, a entrada para a operação de consulta é enviada no conteúdo da requisição, e não como parte da URI da requisição
- Mas, ao contrário do
POST, esse método é explicitamente seguro e idempotente, permitindo recursos como cache e novas tentativas automáticas
Requisição
QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: example/query
Accept: text/csv
select surname, givenname, email limit 10
Resposta
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Location: /contacts/responses/42
Location: /contacts/queries/17
surname, givenname, email
Smith, John, john.smith@example.org
Jones, Sally, sally.jones@example.com
Dubois, Camille, camille.dubois@example.net
7 comentários
Não entendo por que isso precisa ser adicionado ao protocolo.
Existem mesmo tantos cenários em que os parâmetros de consulta passam de alguns KB?
https://www.baeldung.com/cs/http-get-with-body
Parece que a especificação HTTP deixa margem para interpretação por parte do leitor e muda de forma inconsistente, a ponto de estarem tentando criar um método completamente novo
GET com corpo da requisição
Algumas bibliotecas de cliente nem sequer têm uma forma de enviar um corpo de requisição ao fazer um GET, então isso parece que pode ser uma alternativa.
Do ponto de vista da implementação das bibliotecas, não seria, na verdade, uma proposta de mudança de padrão ainda mais desnecessária?
Pela especificação do padrão,
GETnão pode ter corpo de requisição, então a biblioteca estaria passando um corpo de requisição de forma arbitrária... Nesse caso, não seria perfeitamente aceitável simplesmente implementar um método customizado no lado da própria biblioteca?É difícil negar completamente a necessidade, mas, em comparação com
PUT,PATCHeDELETE, que surgiram na transição do HTTP 1.0 para o 1.1, isso me parece menos convincente.https://www.rfc-editor.org/rfc/rfc9110.html#name-method-definitions
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
https://stackoverflow.com/questions/978061/http-get-with-request-body
https://elastic.co/guide/en/…
Na especificação padrão, o método GET não define nada sobre o body, mas em nenhum momento diz que ele não deve ser incluído.
Como há casos em que frameworks de servidor não processam o body em requisições GET, a MDN recomenda não incluir body no método GET.
O Elasticsearch oferece suporte a body no método GET.
Acho que é preciso pensar um pouco mais antes de fazer a especificação mudar por causa da implementação da biblioteca.