在哪里放置 scala Spray 应用程序的图标(即网站的根目录是什么?)?

Where to put favicon for a scala Spray application (i.e. what is the root of the site?)?

Internet 说我应该将我的 favicon.ico 放在站点的根目录中,以防止 Spray 因大量堆栈跟踪而阻塞我的日志。我不知道该站点的根是什么意思,尤其是在 RESTful 喷雾应用程序的上下文中。

假设我的项目在 ~/src/my-project - 我构建它 (sbt assembly),并且从这个位置 运行 它,我应该把 favicon.ico 放在哪里? ?我尝试输入 ~/src/my-project 但我仍然得到堆栈跟踪。

注意:如果我直接从浏览器访问 API(而不是通过我们网站的实际前端),它只会抛出异常。

当前大多数浏览器会自动查找 favicon.ico inside your site's root. So, you have to process their GET /favicon.ico http-requests. The easiest way to do that is to use spray-routing's getFromResource:

import spray.routing.SimpleRoutingApp
import spray.http._
import MediaTypes._

object Main extends App with SimpleRoutingApp {
  implicit val system = ActorSystem("my-system")

  startServer(interface = "localhost", port = 8080) {
    path("favicon.ico") {
      getFromResource("favicon.ico", `image/x-icon`) // will look for the file inside your `resources` folder
    }
  }
}

如果您已经有一些处理 actor(并且不使用 spray-routing),您将需要直接在您的 actor 内部处理 GET /favicon.ico,returning 类似:

def receive = {
   case HttpRequest(GET, Uri.Path("/favicon.ico"), _, _, _) => 
      sender ! HttpResponse(entity = HttpEntity(`image/x-icon`, 
         HttpData(new File("favicon.ico")))) //will take it from a file in application folder, you may also pass any array of byte instead of File
   ...
}

有关第二个选项的详细信息,请参阅 another answer

P.S。如果你不想打扰 favicon.ico 文件 - 你可以 return 只是 StatusCodes.NotFound 在这两种情况下:

  • complete(NotFound) 用于路由
  • sender ! HttpResponse(NotFound) 为你自己的演员

正如在 SiteServiceActor 中完成的那样。

此外,使用 W3C's preferred method (putting the link inside your web pages) won't guarantee cross-browser compatibility as it depends on the browser's search order and there is no W3C standard about that (see siteData-36)。大多数浏览器似乎首先查看网站的根目录,即使您没有任何 html 页面。