端点
返回响应的中间件函数称为端点。端点用于返回数据,例如 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$
端点 vs 端点是低级别的 API,允许开发人员完全控制 HTTP 响应。只有在需要创建供移动应用或第三方服务等外部实体使用的 API 时才推荐使用端点。
当需要在服务器上运行一些代码并将响应返回给应用程序时,通常更好的选择是 server$
函数。server$
具有强类型,并提供了更方便的 API 用于返回数据。