Webserver 带有Crystal的类似WEBrick的服务器

Webserver 带有Crystal的类似WEBrick的服务器,webserver,crystal-lang,Webserver,Crystal Lang,可以用Crystal创建一个简单的web服务器来提供HTML、CSS和JS页面吗 我目前的代码是: require "http/server" Port = 8080 Mime = "text/html" server = HTTP::Server.new([HTTP::ErrorHandler.new, HTTP::LogHandler.new]) do |context| req = context.request if req.method == "GET"

可以用Crystal创建一个简单的web服务器来提供HTML、CSS和JS页面吗

我目前的代码是:

require "http/server"
Port = 8080
Mime = "text/html"

server = HTTP::Server.new([HTTP::ErrorHandler.new, HTTP::LogHandler.new]) do |context|
    req = context.request
    if req.method == "GET"
        filename = File.join(Dir.current, "index.html")
        context.response.content_type = Mime
        context.response.content_length = File.size(filename)
        File.open(filename) { |file| IO.copy(file, context.response) }
        next
    end
    context.response.content_type = Mime

end

puts "\e[1;33mStarted Listening on Port #{Port}\e[0m"
server.listen(Port)
当我运行compile并运行程序时,它会初始化服务器,但有几个问题:

在Firefox浏览器的Inspect元素控制台中,我看到: 服务器只显示index.html的内容

当我使用WEBrick运行或将index.HTML直接加载到浏览器时,HTML、CSS和JS代码是完全有效的

无法从本地网络上的任何其他设备访问我的服务器。 你可能想用这个。它提供来自本地目录的文件

在处理程序中,无论请求是什么,您总是读取index.html文件。这不行。 侦听127.0.0.1,因此它只能从localhost获得。为了能够从网络上访问,您需要监听网络上可用的地址。例如,server.listen0.0.0.0,端口将侦听所有接口。 你可能想用这个。它提供来自本地目录的文件

在处理程序中,无论请求是什么,您总是读取index.html文件。这不行。 侦听127.0.0.1,因此它只能从localhost获得。为了能够从网络上访问,您需要监听网络上可用的地址。例如,server.listen0.0.0.0,端口将侦听所有接口。
非常感谢@johannesmüller解决了我的问题。在这里,我分享了我想要的代码

代码: 这段代码查找提供的路径default Dir.current的index.html文件,如果找到,它将index.html文件共享到提供的IP地址default 0.0.0和端口default 8080,否则它只共享当前目录内容

运行: 这些选项可以被洗牌。例如:

crystal code.cr 5020 /tmp/ 127.0.0.1

这将启动服务器并共享/tmp目录。如果index.html文件位于/tmp/目录中,则请求的浏览器将显示index.html内容,或者它的工作方式与FTP类似,尽管它不是

编译和运行:
非常感谢@johannesmüller解决了我的问题。在这里,我分享了我想要的代码

代码: 这段代码查找提供的路径default Dir.current的index.html文件,如果找到,它将index.html文件共享到提供的IP地址default 0.0.0和端口default 8080,否则它只共享当前目录内容

运行: 这些选项可以被洗牌。例如:

crystal code.cr 5020 /tmp/ 127.0.0.1

这将启动服务器并共享/tmp目录。如果index.html文件位于/tmp/目录中,则请求的浏览器将显示index.html内容,或者它的工作方式与FTP类似,尽管它不是

编译和运行:
如果您不想深入研究本机代码&想要一个简单的解决方案,那么您应该使用任何提供文件服务器的框架

您可以使用Shivneri框架来实现这一点。Shivneri内置了易于配置的文件服务器-

Shivneri.folders = [{
    path: "/",
    folder:  File.join(Dir.current, "assets"),
}]
您可以添加任意数量的文件夹。每个文件夹都将映射到提供的路径


要了解更多信息,请阅读doc-

如果您不想深入研究本机代码并想要一个简单的解决方案,您应该使用任何提供文件服务器的框架

您可以使用Shivneri框架来实现这一点。Shivneri内置了易于配置的文件服务器-

Shivneri.folders = [{
    path: "/",
    folder:  File.join(Dir.current, "assets"),
}]
您可以添加任意数量的文件夹。每个文件夹都将映射到提供的路径

欲了解更多信息,请阅读文档-

crystal code.cr 5020 127.0.0.1 /tmp
crystal build code.cr
./code [options]
Shivneri.folders = [{
    path: "/",
    folder:  File.join(Dir.current, "assets"),
}]