import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const router = new Router();
router
.get("/abc", (context) => {
// we know that so we can hardcode it ...
console.log("Request for: /abc");
context.response.body = "Response from /abc";
})
.get("/def", (context) => {
// ... or we can access the context
console.log("Request for:", context.request.url.pathname);
context.response.body = "Response from /def";
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
2条答案
按热度按时间m0rkklqb1#
Deno有几个不同的Web服务器API(然后还有构建在它们之上的框架)。但我认为大多数(所有?)都为处理程序提供了
Request
object,它有一个url
属性,告诉你请求的URL是什么。hmae6n7t2#
PHP可以有一个全局变量来存储请求URL,因为它的工作方式与Deno不同。
在Deno中,你通常在一些请求处理函数的一个参数中获得URL,但是如果你使用任何框架来帮助你处理这些请求,你通常甚至不需要它(参见下面的示例)。
使用
std
库中的裸serve
实用程序,您可以像这样处理请求:在上面的示例中,
req.url
之所以存在,是因为它在每次调用handler()
函数(针对每个请求)时都被传递给该函数,因为该函数通过调用serve(handler);
注册为所有请求的处理程序如果将其保存为
main.ts
,则可以使用以下命令运行此程序:默认端口是8000,所以你可以运行curl来发出这样的请求:
它将显示:
现在,这是一个非常低级的API,实际上你可能想使用像oak这样的库。例如,要有一个使用oak的等效服务器,它的工作方式与前面的例子中的
serve
不同,你可以使用这样的东西:因此,在这里,您访问的URL不是
req.url
,而是ctx.request.url.href
(或者如果您命名参数不同,则以ctx
以外的其他名称开始)。.href
在这里以字符串的形式获取完整的URL,因为ctx.request.url
是一个对象-URL的示例)。但是你通常不会这样访问你的URL,而是使用单独的处理程序来定义路由,这些处理程序会为特定的URL运行,例如:
请注意,我们不必在这些处理程序中测试URL,但我们当然可以。它们已经知道它们正在服务哪个URL,因为
oak
库运行它们以获得它们需要服务的正确路由。因此,这完全取决于您使用什么框架库来处理请求--您通常会为生产代码而不是直接使用
serve
(除非您有一些非常特殊的需求)。要找到适合您需求的良好框架,请参阅: