akka http route HttpEntity.fromFile return 403 如果文件不存在
akka http route HttpEntity.fromFile return 403 if file does not exist
这个 akka http 路由 return 是预期的文件。但是,如果该文件不存在,它 return 是一个 500 内部错误。如果文件不存在,如何 return 出现 403 文件未找到错误?
pathSingleSlash {
get {
complete(HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html")))
}
}
我想你的意思是 404 未找到。 403 是禁止的。
这是我的解决方案:
pathSingleSlash {
get {
val file = new java.io.File("example.html")
val result = if (file.exists) HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, file)
else HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound)
complete(result)
}
}
如果您想在响应中显示某种 JSON 或消息,那么对于 HttpResponse 使用 HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound, entity = someMessage)
.
这不是我个人实施的方式,但如果不进行更多测试,我不知道我的替代解决方案是否有效。所以我会采用上面描述的解决方案。
让我描述一下我的替代解决方案,如果您愿意,可以尝试实施它。通常,500 状态代码意味着您的代码正在抛出未捕获的异常,所以而不是
val result = if (file.exists) HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html"))
else HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound)
我会在 Try monad 或 try-catch 块中包装 result
以处理抛出的异常。
但是,在没有进一步测试的情况下,我无法确定 500 状态码的原因是否是由于异常引起的,因此对于我在这里的回答,我将按照我上面描述的内容进行。
正如@Allen Han 所说,您可以将其包装在 Try
中并使用 rejectEmptyResponse
pathSingleSlash {
get {
rejectEmptyResponse {
complete(Try(HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html")).toOption)
}
}
}
这个 akka http 路由 return 是预期的文件。但是,如果该文件不存在,它 return 是一个 500 内部错误。如果文件不存在,如何 return 出现 403 文件未找到错误?
pathSingleSlash {
get {
complete(HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html")))
}
}
我想你的意思是 404 未找到。 403 是禁止的。
这是我的解决方案:
pathSingleSlash {
get {
val file = new java.io.File("example.html")
val result = if (file.exists) HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, file)
else HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound)
complete(result)
}
}
如果您想在响应中显示某种 JSON 或消息,那么对于 HttpResponse 使用 HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound, entity = someMessage)
.
这不是我个人实施的方式,但如果不进行更多测试,我不知道我的替代解决方案是否有效。所以我会采用上面描述的解决方案。
让我描述一下我的替代解决方案,如果您愿意,可以尝试实施它。通常,500 状态代码意味着您的代码正在抛出未捕获的异常,所以而不是
val result = if (file.exists) HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html"))
else HttpResponse(status = akka.http.scaladsl.model.StatusCodes.NotFound)
我会在 Try monad 或 try-catch 块中包装 result
以处理抛出的异常。
但是,在没有进一步测试的情况下,我无法确定 500 状态码的原因是否是由于异常引起的,因此对于我在这里的回答,我将按照我上面描述的内容进行。
正如@Allen Han 所说,您可以将其包装在 Try
中并使用 rejectEmptyResponse
pathSingleSlash {
get {
rejectEmptyResponse {
complete(Try(HttpEntity.fromFile(ContentTypes.`text/html(UTF-8)`, new java.io.File("example.html")).toOption)
}
}
}