Internet说我应该将我的favicon.ico放在网站的根目录中,以阻止Spray用巨大的堆栈跟踪堵塞我的日志。我不知道网站的根目录是什么意思,特别是在RESTful喷涂应用程序的上下文中。
假设我的项目在〜/ src / my-project中 - 我构建它(sbt assembly
),然后从这个位置运行它,我应该把favicon.ico放在哪里?我尝试放入〜/ src / my-project,但我仍然得到了堆栈跟踪。
注意:如果我从浏览器直接访问API(而不是通过我们网站的实际前端),它只会引发异常。
答案 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网页。