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

时间:2015-01-25 22:47:34

标签: scala rest akka favicon spray

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

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

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

1 个答案:

答案 0 :(得分:9)

大多数当前浏览器会自动在您网站的根目录中查找favicon.ico。因此,您必须处理他们的GET /favicon.ico http-requests。最简单的方法是使用spray-routing' 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
    }
  }
}

如果你已经有一些处理演员(并且不使用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
   ...
}

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

P.S。如果您不想打扰favicon.ico文件 - 在这两种情况下您都可能只返回StatusCodes.NotFound

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

SiteServiceActor内完成。

此外,使用W3C's preferred method(将链接放在您的网页中)不能保证跨浏览器的兼容性,因为它取决于浏览器的搜索顺序,并且没有关于该浏览器的W3C标准(见siteData-36)。大多数浏览器似乎首先会查看网站的根目录,即使您没有任何html网页。