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

sam*_*est 4 rest favicon scala akka spray

互联网说我应该把我的favicon.ico放在网站的根目录,以阻止Spray用巨大的堆栈跟踪堵塞我的日志.我不知道网站的根目录是什么意思,特别是在RESTful喷涂应用程序的上下文中.

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

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

dk1*_*k14 9

大多数当前浏览器会自动favicon.ico在您网站的根目录中查找.所以,你必须处理他们的GET /favicon.ico http请求.最简单的方法是使用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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你已经有一些处理演员(并且不使用spray-routing),你将需要GET /favicon.ico直接在你的演员内部处理,返回如下内容:

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
   ...
}
Run Code Online (Sandbox Code Playgroud)

有关第二个选项的更多信息,请参阅其他答案

PS如果你不想打扰favicon.ico文件 - 你可以StatusCodes.NotFound在两种情况下都返回:

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

因为它是在里面完成的SiteServiceActor.

此外,使用W3C的首选方法(将链接放在您的网页中)并不能保证跨浏览器兼容性,因为它取决于浏览器的搜索顺序,并且没有关于此的W3C标准(请参阅siteData-36).大多数浏览器似乎首先查看网站的根目录,即使您没有任何HTML页面.