端点

一个返回响应的 中间件函数 被称为端点。端点对于返回数据非常有用,例如 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$

端点是低级 API,可以让开发者完全控制 HTTP 响应。仅当您需要创建供外部实体(例如移动应用程序或第三方服务)使用的 API 时,才建议使用它们。

当您需要在服务器上运行一些代码并将响应返回给应用程序时,server$ 函数通常是更好的选择。server$ 是强类型的,并提供更方便的 API 来返回数据。

贡献者

感谢所有帮助改进这份文档的贡献者!

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