关于 http-endpoints
面向 Val Town 开发者的 HTTP val 指南,介绍如何处理传入请求,并说明端点地址、访问限制、常见实现方式和平台约束。
主要功能
- 01处理 HTTP 请求
- 02获取实时端点地址
- 03了解受限访问行为
- 04CORS 与重定向处理
- 05平台限制说明
适用场景
- 01在 Val Town 创建 HTTP API
- 02从 HTTP val 提供静态文件
- 03编辑后检查端点响应
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ val-town/ plugins --skill http-endpoints安装后在 Claude Code 中输入/http-endpoints确认已加载。
详细介绍
HTTP 端点
HTTP val(fileType: "http")会导出一个请求处理程序,并在每次收到 HTTP 请求时运行。每个 HTTP 文件都会分配一个实时 URL——切勿自行构造;请从 list_files 或 create_file 的响应中读取 links.endpoint,或调用 fetch_val_endpoint。
除非 val 的应用访问权限(httpPrivacy)设为 restricted,否则任何人都可以访问该 URL;如果设为 restricted,未通过身份验证的调用方会收到指向登录页面的 302,而不是你的响应——请参阅 restricted-access 技能。
基本处理程序
// Learn more: https://docs.val.town/vals/http/
export default async function (req: Request): Promise<Response> {
return Response.json({ ok: true });
}
文件必须包含 export——处理程序应使用 export default。
Hono
使用 Hono 时,请导出 app.fetch(而不是 app):
import { Hono } from "npm:hono";
import { parseVal, serveImmutableFile } from "https://esm.town/v/std/utils/index.ts";
const app = new Hono();
app.get("/", (c) => c.text("hello"));
// Immutable asset caching (see the client-side-js skill): serves the
// current-version URLs your HTML shell stamps with immutableFileUrl()
app.get("/__immutable/*", (c) => serveImmutableFile(c.req.path));
// View source redirect
app.get("/source", (c) => c.redirect(parseVal().links.self.val));
// Always add this for full stack traces on errors:
app.onError((err) => Promise.reject(err));
export default app.fetch;
Hono 的 serveStatic 在 Val Town 上无法使用。静态文件请使用 std/utils 中的 serveFile / staticHTTPServer。如需查看完整的 std/utils API(readFile、serveFile、staticHTTPServer、listFiles、listFilesByPath、httpEndpoint、parseVal,……),请获取 https://utilities.val.run/docs.md。
CORS
Val Town 默认会添加宽松的 CORS 标头(Access-Control-Allow-Origin: *),因此在 99% 的情况下,你完全不需要处理 CORS。几乎总是没必要使用 Hono 的 cors 中间件。
如果你自行设置了任何 CORS 标头,Val Town 就会停止添加所有默认标头——因此,要么自行完整处理 CORS,要么完全不要处理。
重定向
Response.redirect 在 Val Town 上无法使用。请使用以下方式之一:
return new Response(null, { status: 302, headers: { Location: "/path" } });
// or, with Hono:
return c.redirect("/path");
不可用的功能
- WebSocket:Val Town 不接受传入的 WebSocket 连接。请改用轮询、长轮询或服务器发送事件。
- 文件系统访问:请参阅平台限制。对于持久化状态,请使用
std/sqlite或std/blob。
显示客户端错误
对于 HTML 响应,请添加此脚本标签,将浏览器错误发送回 val 日志(可通过 get_logs 查看):
<script src="https://esm.town/v/std/catch"></script>
验证更改
编辑 HTTP val 后,请获取该 val,以确认它返回了预期的 HTTP 响应。完成此步骤前,请勿报告更改已完成。