端點

如果 中間件函式 返回一個回應,則稱為端點。端點對於返回資料非常有用,例如 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));

端點 vs server$

端點是低階 API,允許開發人員完全控制 HTTP 回應。僅當您需要建立要由外部實體(例如行動應用程式或第三方服務)使用的 API 時,才建議使用它們。

當您需要在伺服器上執行一些程式碼並將回應返回應用程式時,server$ 函式通常是更好的選擇。 server$ 是強型別的,並且提供更方便的 API 來返回資料。

貢獻者

感謝所有幫助改進此文件的貢獻者!

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