Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中理解WS-library的困难_Scala_Playframework 2.0 - Fatal编程技术网

在Scala中理解WS-library的困难

在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

我正在尝试使用play框架学习scala,并尝试完全用scala重写一个旧项目以供练习。我已经写了一个路线,注册了一个新的订阅者,并使用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"
              )
            )
          )
        )
        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的区别,这对我帮助很大。