在哪里放置 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 页面。
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 页面。