在Scala中理解WS-library的困难
我正在尝试使用play框架学习scala,并尝试完全用scala重写一个旧项目以供练习。我已经写了一个路线,注册了一个新的订阅者,并使用mandrill向他们发送了一封感谢电子邮件。我还有一些基本的错误检查。代码如下在Scala中理解WS-library的困难,scala,playframework-2.0,Scala,Playframework 2.0,我正在尝试使用play框架学习scala,并尝试完全用scala重写一个旧项目以供练习。我已经写了一个路线,注册了一个新的订阅者,并使用mandrill向他们发送了一封感谢电子邮件。我还有一些基本的错误检查。代码如下 def create = Action.async(parse.json) { request => request.body.validate[Subscriber].map {subscriber => if (!isValidEmail(subsc
def create = Action.async(parse.json) { request =>
request.body.validate[Subscriber].map {subscriber =>
if (!isValidEmail(subscriber.email)){
Future.successful(BadRequest(Json.obj("message"->"Invalid email address")))
}
else{
collection.insert(subscriber).map {lastError =>
val data = Json.obj(
"key" -> Play.current.configuration.getString("mandrill.key").get,
"template_name" -> "Initial Email",
"template_content" -> Json.arr(),
"message" -> Json.obj(
"subject"-> "Example",
"from_email"-> "info@example.org",
"from_name" -> "example",
"to"-> Json.arr(
Json.obj(
"email"-> subscriber.email,
"name"-> subscriber.fname,
"type"-> "to"
)
)
)
)
WS.url("https://mandrillapp.com/api/1.0/messages/send-template.json").post(data)
Ok(Json.obj("message"->"User created successfully"))
}
.recover {
case e: Throwable => BadRequest(Json.obj("message" -> "A user with email ${subscriber.email} already exists"))
}
}
}.getOrElse(Future.successful(BadRequest(Json.obj("message" -> "Not enough parameters"))))
}
这是可行的,但我想阻止WS-call,以便在发送回成功消息之前等待它的响应,因为如果mandrill向我发送回错误,我想返回错误。所以我试着这样做:
def create = Action.async(parse.json) { request =>
request.body.validate[Subscriber].map {subscriber =>
if (!isValidEmail(subscriber.email)){
Future.successful(BadRequest(Json.obj("message"->"Invalid email address")))
}
else{
collection.insert(subscriber).map {lastError =>
val data = Json.obj(
"key" -> Play.current.configuration.getString("mandrill.key").get,
"template_name" -> "Initial Email",
"template_content" -> Json.arr(),
"message" -> Json.obj(
"subject"-> "Example",
"from_email"-> "info@example.org",
"from_name" -> "example",
"to"-> Json.arr(
Json.obj(
"email"-> subscriber.email,
"name"-> subscriber.fname,
"type"-> "to"
)
)
)
)
//This line right below doesn't work
WS.url("https://mandrillapp.com/api/1.0/messages/send-template.json").post(data).map{response =>
if (response.status == 200){
Ok(Json.obj("message"->"User created successfully"))
}
else {
BadRequest(Json.obj("message"->"Unknown error"))
}
}
}
.recover {
case e: Throwable => BadRequest(Json.obj("message" -> "A user with email ${subscriber.email} already exists"))
}
}
}.getOrElse(Future.successful(BadRequest(Json.obj("message" -> "Not enough parameters"))))
}
但这会产生以下错误
type mismatch;
found : scala.concurrent.Future[Object]
required: scala.concurrent.Future[play.api.mvc.Result]
在线
}.getOrElse(Future.successful(BadRequest(Json.obj("message" -> "Not enough parameters"))))
有人能给我解释一下吗。我不想用等待。我只想使用map,这样我就可以得到结果,处理它们,然后返回“Ok”消息。我正在使用play 2.3.x和scala 2.11,似乎您正在
集合的映射块内调用WS
。插入。map
要求您返回一个play.api.mvc.Result
,但是WS.post
和您附加到它的map
返回一个Future[play.api.mvc.Result]
假设Future.successful(BadRequest(Json.obj(“message”->“无效电子邮件地址”))
返回Future[play.api.mvc.Result]
和您的集合。insert
返回Future[play.api.mvc.Result]
常见的推断类型是Future[Object]
如果您更改集合上的映射
。将插入到平面映射
,即表示您不打算返回未来的[play.api.mvc.Result]
,而是打算返回未来的[play.api.mvc.Result]
,您应该获得要排列的类型,例如:
def create = Action.async(parse.json) { request =>
request.body.validate[Subscriber].map { subscriber =>
if (!isValidEmail(subscriber.email)){
Future.successful(BadRequest(Json.obj("message"->"Invalid email address")))
} else {
collection.insert(subscriber).flatMap { lastError =>
val data = Json.obj(
"key" -> Play.current.configuration.getString("mandrill.key").get,
"template_name" -> "Initial Email",
"template_content" -> Json.arr(),
"message" -> Json.obj(
"subject"-> "Example",
"from_email"-> "info@example.org",
"from_name" -> "example",
"to"-> Json.arr(
Json.obj(
"email"-> subscriber.email,
"name"-> subscriber.fname,
"type"-> "to"
)
)
)
)
WS.url("https://mandrillapp.com/api/1.0/messages/send-template.json")
.post(data).map{ response =>
if (response.status == 200) {
Ok(Json.obj("message"->"User created successfully"))
} else {
BadRequest(Json.obj("message"->"Unknown error"))
}
}
}.recover {
case e: Throwable => BadRequest(Json.obj("message" -> "A user with email ${subscriber.email} already exists"))
}
}
}.getOrElse(Future.successful(BadRequest(Json.obj("message" -> "Not enough parameters"))))
}
非常感谢你的解释。我不知道使用flatmap和map的区别,这对我帮助很大。