Scala 找不到Akka HTTP路由?
我正在学习使用Akka Http构建服务器,这就是我到目前为止所写的内容Scala 找不到Akka HTTP路由?,scala,akka,spray,akka-http,Scala,Akka,Spray,Akka Http,我正在学习使用Akka Http构建服务器,这就是我到目前为止所写的内容 import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.server.Directives._ import akka.stream.{Materializer, ActorMaterializer} import spray.json.DefaultJsonProtocol import akka.htt
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.{Materializer, ActorMaterializer}
import spray.json.DefaultJsonProtocol
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
import scala.concurrent.ExecutionContextExecutor
// todo() : add event timestamp
case class ECFailure(symbolicName:String)
trait Protocols extends DefaultJsonProtocol {
implicit val ecFailureFormat = jsonFormat1(ECFailure.apply)
}
trait EmailService extends Protocols {
implicit val system: ActorSystem
implicit def executor: ExecutionContextExecutor
implicit val materializer: Materializer
val route =
logRequestResult("email-service") {
pathPrefix("ec") {
(post & entity(as[ECFailure])) { ecFailure =>
complete {
println("received: " + ecFailure)
"Done"
}
}
}
path("") {
get {
complete {
"Welcome."
}
}
}
}
}
object ECServer extends App with EmailService {
override implicit val system = ActorSystem("ec-server")
override implicit val executor = system.dispatcher
override implicit val materializer = ActorMaterializer()
val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
}
当我运行它并到达端点时,我看到
$curl-vhttp://localhost:8080
*重新生成的URL到:http://localhost:8080/
*在DNS缓存中找不到主机名
*正在尝试::1。。。
*连接到::1端口8080失败:连接被拒绝
*正在尝试127.0.0.1。。。
*已连接到本地主机(127.0.0.1)端口8080(#0)
>GET/HTTP/1.1
>用户代理:curl/7.37.1
>主机:本地主机:8080
>接受:*/*
>
但另一个端点不可用
$curl-v-XPOST-d“{'symbolicName':'ABC'}”-H“内容类型:application/json”http://localhost:8080/ec
*在DNS缓存中找不到主机名
*正在尝试::1。。。
*连接到::1端口8080失败:连接被拒绝
*正在尝试127.0.0.1。。。
*已连接到本地主机(127.0.0.1)端口8080(#0)
>POST/ec HTTP/1.1
>用户代理:curl/7.37.1
>主机:本地主机:8080
>接受:*/*
>内容类型:application/json
>内容长度:23
>
*完全发送上载:23个字节中的23个
未找到
在服务器上,我将日志视为
Connected to the target VM, address: '127.0.0.1:58024', transport: 'socket'
[DEBUG] [07/28/2015 14:50:59.528] [main] [EventStream(akka://ec-server)] logger log1-Logging$DefaultLogger started
[DEBUG] [07/28/2015 14:50:59.530] [main] [EventStream(akka://ec-server)] Default Loggers started
[DEBUG] [07/28/2015 14:51:00.016] [ec-server-akka.actor.default-dispatcher-6] [akka://ec-server/system/IO-TCP/selectors/$a/0] Successfully bound to /127.0.0.1:8080
[DEBUG] [07/28/2015 14:51:03.917] [ec-server-akka.actor.default-dispatcher-6] [akka://ec-server/system/IO-TCP/selectors/$a/0] New connection accepted
[DEBUG] [07/28/2015 14:51:04.258] [ec-server-akka.actor.default-dispatcher-13] [ActorSystem(ec-server)] email-service: Response for
Request : HttpRequest(HttpMethod(GET),http://localhost:8080/,List(User-Agent: curl/7.37.1, Host: localhost:8080, Accept: */*),HttpEntity.Strict(none/none,ByteString()),HttpProtocol(HTTP/1.1))
Response: Complete(HttpResponse(200 OK,List(),HttpEntity.Strict(text/plain; charset=UTF-8,ByteString(87, 101, 108, 99, 111, 109, 101, 46)),HttpProtocol(HTTP/1.1)))
[DEBUG] [07/28/2015 14:51:06.265] [ec-server-akka.actor.default-dispatcher-19] [akka://ec-server/system/IO-TCP/selectors/$a/0] New connection accepted
[DEBUG] [07/28/2015 14:51:06.284] [ec-server-akka.actor.default-dispatcher-17] [ActorSystem(ec-server)] email-service: Response for
Request : HttpRequest(HttpMethod(POST),http://localhost:8080/ec,List(User-Agent: curl/7.37.1, Host: localhost:8080, Accept: */*),HttpEntity.Strict(application/json,ByteString(123, 39, 115, 121, 109, 98, 111, 108, 105, 99, 78, 97, 109, 101, 39, 58, 32, 39, 65, 66, 67, 39, 125)),HttpProtocol(HTTP/1.1))
Response: Rejected(List())
这里有什么不正确的地方?不同路线之间缺少问题
~
。下面的代码修复了它
val route =
logRequestResult("email-service") {
pathPrefix("ec") {
(post & entity(as[ECFailure])) { ecFailure =>
complete {
println("received: " + ecFailure)
"Done"
}
}
} ~
path("") {
get {
complete {
"Welcome."
}
}
}
}
卷曲有效吗
$curl-v-XPOST-d'{“symbolicName”:“ABC”}'-H“内容类型:application/json”http://localhost:8080/ec
*在DNS缓存中找不到主机名
*正在尝试::1。。。
*连接到::1端口8080失败:连接被拒绝
*正在尝试127.0.0.1。。。
*已连接到本地主机(127.0.0.1)端口8080(#0)
>POST/ec HTTP/1.1
>用户代理:curl/7.37.1
>主机:本地主机:8080
>接受:*/*
>内容类型:application/json
>内容长度:23
>
*完全发送上载:23个字节中的23个
不同路线之间缺少问题~
。下面的代码修复了它
val route =
logRequestResult("email-service") {
pathPrefix("ec") {
(post & entity(as[ECFailure])) { ecFailure =>
complete {
println("received: " + ecFailure)
"Done"
}
}
} ~
path("") {
get {
complete {
"Welcome."
}
}
}
}
卷曲有效吗
$curl-v-XPOST-d'{“symbolicName”:“ABC”}'-H“内容类型:application/json”http://localhost:8080/ec
*在DNS缓存中找不到主机名
*正在尝试::1。。。
*连接到::1端口8080失败:连接被拒绝
*正在尝试127.0.0.1。。。
*已连接到本地主机(127.0.0.1)端口8080(#0)
>POST/ec HTTP/1.1
>用户代理:curl/7.37.1
>主机:本地主机:8080
>接受:*/*
>内容类型:application/json
>内容长度:23
>
*完全发送上载:23个字节中的23个
您需要在路径前缀(“ec”){,,,
和路径(“{…}”)之间添加~
。您需要在路径前缀(“ec”){,,,,
和路径(“{…})之间添加~
。是的,这是一个无法可靠检测的难题。避免此类问题的最佳实践是尽可能在路由树中使用括号而不是大括号。是的,这是一个无法可靠检测的难题。避免此类问题的最佳实践是在路由树中使用括号而不是大括号只要有可能,就把树砍掉。