HTTPに新メソッド「QUERY」登場!GETとPOSTの間を埋めるRFC10008を詳しく解説

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回は2026年6月に策定され、GETの安全性とPOSTの表現力を両立する新たなHTTPメソッドとして注目を集める「QUERY」をご紹介します。

はじめに

2026年6月にHTTPに新しい仕様であるQUERYメソッドが策定されました。従来、WebアプリケーションではGETやPOSTなどのメソッドが使われてきましたが、QUERYメソッドはこれらを補完する新しい選択肢として追加されました。

今回はQUERYメソッドの特長や従来のメソッドとの違いを解説していきます。GETやPOSTが抱えていた問題とQUERYメソッドの適用場面も併せて解説しています。

QUERYメソッドとは

QUERYメソッドの概要

QUERYメソッドは、RFC10008で標準化された新しいHTTPメソッドです。

サーバーからの情報取得を想定しており、複雑な検索条件でも安全かつ冪等(べきとう)にリクエストを送信できる特長を持ちます。そのため、検索APIのような読み取り専用の処理をHTTPの意味論に沿って表現でき、通信途絶時の再試行なども行いやすくなります。

使い方は、メソッド名以外は従来のメソッドと大きく変わりません。注目すべき点は、下記のように検索条件となる情報をすべてリクエストボディに含めているところです。

QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Accept: application/json

select=surname,givenname,email&limit=10&match=%22email=*@example.*%22

リクエストボディではJSONやXMLなどのフォーマットによる表現が可能になり、URIも非常にシンプルになります。

従来のメソッド(GETやPOST)との違い

従来は情報取得の場面では、GETとPOSTのメソッドが多く使われてきました。

GETは情報の取得に使われるメソッドで、URIに含めたクエリパラメータで条件を指定します。しかし、検索条件が複雑になるとURIが長くなり、入れ子構造や配列を含むデータの表現も難しくなります。また、URIはアクセスログやブラウザ履歴などに残りやすいため、検索条件によっては取り扱いに注意が必要です。GETも安全かつ冪等なメソッドですが、リクエストボディを使った問い合わせ内容の記述には標準的な意味が定義されていないため、複雑な検索APIの実装では課題がありました。

一方でPOSTはリクエストボディが使えるメソッドです。POSTは本来サーバー上のデータに変更を加える想定で使われるメソッドですが、情報取得の場面でも代用されています。ただし、POSTは安全性や冪等性が保証されておらず、HTTPレベルでは読み取り専用の問い合わせであることを表現できません。

このように、QUERYメソッドはGETとPOSTの中間を埋めるために追加されたHTTPメソッドです。GETのように安全かつ冪等でありながら、POSTのようにリクエストボディへ複雑な検索条件を記述できることが大きな特長です。

ただし、公開からまだ日が浅いため、フレームワークやライブラリなどの対応状況には注意が必要です。

GETリクエストボディとの違い

複雑な検索条件を扱うAPIでは、「GETメソッドにリクエストボディを付与すればよいのでは」と考えることがあります。しかし、HTTP仕様ではGETリクエストのボディに標準的な意味は定義されておらず、クライアントやサーバー、CDN、プロキシなどの実装によっては正しく扱われない場合があります。

QUERYメソッドは、この問題を解決するために標準化されたHTTPメソッドです。リクエストボディを利用して検索条件を表現しながらも、HTTPレベルで「安全かつ冪等な問い合わせ」であることを示せるため、GETとPOSTの間にあった課題を解消できます。

QUERYメソッドの特長

安全かつ冪等性のあるメソッド

HTTPメソッドにおいて、安全性と冪等性(べきとうせい)はリクエストの意味を理解する上で重要な特性です。

  • 安全性:リクエストによってサーバー上のデータが変更されるなどの副作用をもたらさない性質です。
  • 冪等性:同じリクエストを複数回送信しても、サーバーに対する意図した効果が変わらない性質です。レスポンス内容まで同一であることを保証するものではなく、検索対象のデータが更新されれば結果が変化する場合もあります。

QUERYメソッドはこの両方の性質を兼ね備えており、情報取得用途に適したHTTPメソッドとして利用できます。なお、GETメソッドも安全性と冪等性を持ちますが、クエリの表現がURL内に限られるため、複雑な検索条件を扱う用途には制約があります。

複雑な検索条件に対応可

QUERYメソッドでは、リクエストボディを使って柔軟にクエリを作成できます。GETメソッドのクエリパラメータで表現する方法では、パラメータの長さの制限があったり、URIに含められる文字列の制限がありましたが、リクエストボディを使うことでそれらの問題を解消できます。リクエストボディは多くの情報を詰め込むことができる上に、JSONのようなスマートな記述が可能になり、表現の自由度は大幅に広がっています。

また、QUERYはキャッシュとの親和性も考慮された設計となっており、リクエストボディを含めた問い合わせ内容に基づいてキャッシュを構築できます。

QUERYメソッドを使ってみよう

ここからはQUERYメソッドを使って検索APIを作成していきます。なお、作成にはNode.jsがインストールされている必要がありますので、事前に準備しておきましょう。今回は下記の環境で使用していきます。

  • Ubuntu v24.04
  • Node.js v24.11.1

サーバー側プログラムの作成

最初に下記コマンドのように、今回のプロジェクト用のディレクトリを作成し、初期化コマンドを実行しましょう。

mkdir http-query-sample
cd http-query-sample
npm init -y

続いて、QUERYメソッドを受け付けるサーバー側のプログラムを作成します。下記のコードでserver.jsを作成しましょう。

const http = require('http');

const contacts = [
  { id: 1, name: 'Tanaka Ichiro', email: 'tanaka_i@example.com' },
  { id: 2, name: 'Tanaka Jiro', email: 'tanaka_j@example.com' },
  { id: 3, name: 'Suzuki Saburo', email: 'suzuki@example.com' }
];

const server = http.createServer((req, res) => {
  if(req.method !== 'QUERY') {
    res.writeHead(405, {'Allow': 'QUERY'});
    res.end('Method Not Allowed');
    return;
  }

  if(req.url !== '/contacts') {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end('Not Found');
    return;
  }

  let body = [];

  req.on('data', chunk => {
    body.push(chunk);
  });

  req.on('end', () => {
    const raw = Buffer.concat(body).toString();
    let jsonData;
    try {
      jsonData = JSON.parse(raw);
    } catch {
      res.writeHead(400);
      res.end('Invalid JSON');
      return;
    }

    const regex = new RegExp(jsonData.name);
    let filteredContacts = contacts.filter(contact => regex.test(contact.name));

    res.writeHead(200, { 
      'Content-Type': 'application/json',
      'Content-Location': req.url
    });
    res.end(JSON.stringify({status: 'success', received: filteredContacts}));
  });
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});

上記のコードでは、連絡先を取得するための/contactsへのアクセスとQUERYメソッドのみを受け付け、検索条件による絞り込みを可能にしています。

QUERYメソッドを使ったリクエスト送信

サーバープログラムの準備ができたら、次のコマンドを実行しましょう。サーバーはhttp://localhost:3000で起動します。

node server.js

上記とは別のターミナルを開き、curlコマンドでQUERYメソッドのリクエストを送信してみましょう。

curl -X QUERY -i http://localhost:3000/contacts -H "Content-Type: application/json" -d '{"name": "^Tanaka"}'

下記のようなレスポンスが表示されたら成功です。レスポンスヘッダに200番が返っていれば正常に処理されています。

QUERYメソッドを実行

jqでレスポンスを整形すると以下のようになります。

curl -X QUERY http://localhost:3000/contacts -H "Content-Type: application/json" -d '{"name": "^Tanaka"}' |
 jq
jqでレスポンスを整形

さいごに

HTTPのGETやPOSTで生じていた問題を解消すべく、新しくQUERYメソッドが策定されました。QUERYメソッドは主に検索や問い合わせなどの読み取り用途で利用され、GETよりも表現の幅が広く、POSTと比べて副作用がなく安全に実行できる特長を持ちます。新しい仕様のため導入には慎重に検討しなければなりませんが、今後、フレームワークやライブラリ、CDNなどの対応が進むことで、複雑な検索APIの実装における有力な選択肢となることが期待されています。


メシウスでは様々なWebアプリケーションフレームワークと一緒に使えるJavaScriptライブラリを提供しています。

メシウスのJavaScriptライブラリ

無償のトライアル版や、ブラウザ上で手軽に試せるデモアプリケーションも公開しているので、こちらも是非ご覧ください。

\  この記事をシェアする  /