エンドポイント

レスポンスを返すミドルウェア関数は、エンドポイントと呼ばれます。エンドポイント は、RESTful API、GraphQL API、JSON、XML、リバースプロキシなど、HTTP レスポンスのあらゆる側面を制御する必要があるあらゆるタイプの API からデータを取得するのに役立ちます。レスポンス(例:`json` を使用)を返すことで、ミドルウェアチェーンのその時点以降の以降のミドルウェア関数の実行が停止します。

すべてのエンドポイントは、エンドポイントのレスポンスを制御するためのRequestEvent API を受信します。

たとえば、/greet/ URL に移動すると、このエンドポイントは {"hello":"world"} を返します。

ファイル: src/routes/greet/index.tsx

import { type RequestHandler } from '@builder.io/qwik-city';
 
export const onGet: RequestHandler = async ({ json }) => {
  json(200, { hello: 'world' });
};

レスポンスを送信することは、エンドポイントとミドルウェアを区別するものです。レスポンスを送信する(例:`json()` を使用する)ことは、暗黙的にミドルウェアチェーンを停止します。

fetch を使用したリバースプロキシの作成

別のサーバーをリクエストするために `fetch()` メソッドを使用することで、リバースプロキシを作成できます。次に、`send()` メソッドを使用してレスポンスをクライアントに送り返します。

import type { RequestHandler } from '@builder.io/qwik-city';
 
export const onGet: RequestHandler = async ({ send, url }) => {
  const response = await fetch(
    new URL('/demo/qwikcity/middleware/json/', url)
  );
  send(response.status, await response.text());
};

ストリームレスポンスの手動作成

エンドポイントは、`getWritableStream()` メソッドを使用して、HTTP レスポンスストリームに手動で書き込むことができます。これは、サーバー送信イベントエンドポイントなどのストリーミングエンドポイントを作成するのに役立ちます。

import type { RequestHandler } from '@builder.io/qwik-city';
 
export const onGet: RequestHandler = async (requestEvent) => {
  const writableStream = requestEvent.getWritableStream();
  const writer = writableStream.getWriter();
  const encoder = new TextEncoder();
 
  writer.write(encoder.encode('Hello World\n'));
  await wait(100);
  writer.write(encoder.encode('After 100ms\n'));
  await wait(100);
  writer.write(encoder.encode('After 200ms\n'));
  await wait(100);
  writer.write(encoder.encode('END'));
  writer.close();
};
 
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));

エンドポイントと server$ の比較

エンドポイントは、開発者にHTTP レスポンスの完全な制御を与える低レベルAPI です。モバイルアプリやサードパーティサービスなど、外部エンティティが使用する API を作成する必要がある場合にのみ推奨されます。

サーバーでコードを実行し、アプリにレスポンスを返す必要がある場合は、通常、server$ 関数がより良い選択肢です。server$ は厳密に型付けされており、データの返却のためのより便利な API を提供します。

貢献者

このドキュメントの改善に貢献してくれたすべての貢献者に感謝します!

  • adamdbradley
  • manucorporat
  • mhevery
  • CoralWombat
  • hamatoyogi
  • igorbabko
  • mrhoodz
  • EamonHeffernan
  • kumarasinghe
  • electather
  • wtlin1228
  • PatrickJS
  • the-r3aper7