我正在努力使用Twitter的Finagle库来实现对SOAP服务器的HTTP请求.
下面的代码成功地执行了第一次测试(使用java.net.URL),但是我在第二次测试时遇到了困难(使用Finagle客户端).我究竟做错了什么?
此外,我一直被拖入和命令式的写作风格.如果你能帮助我让Finagle更像'scala',我将非常感激.
开始:
import java.net.InetSocketAddress
import scala.xml.{Elem, XML}
import org.jboss.netty.buffer.ChannelBuffers
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.finagle.Service;
import com.twitter.finagle.builder.ClientBuilder;
import com.twitter.finagle.http.Http;
import org.jboss.netty.handler.codec.http._
class SoapClient {
private def error(msg: String) = {
println("SoapClient error: " + msg)
}
def wrap(xml: Elem): String = {
val buf = new StringBuilder
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=
\"no\"?>\n")
buf.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://
schemas.xmlsoap.org/soap/envelope/\">\n")
buf.append("<SOAP-ENV:Body>\n")
buf.append(xml.toString)
buf.append("\n</SOAP-ENV:Body>\n")
buf.append("</SOAP-ENV:Envelope>\n")
buf.toString
}
def sendWithJavaNetURL(host: String, req: Elem): Option[Elem] = {
val url = new java.net.URL(host)
val outs = wrap(req).getBytes
val conn …Run Code Online (Sandbox Code Playgroud) 使用提升嵌入时,如何在Slick中解除查询中的值?我希望一个'得到','长'或类似的东西可以做到这一点,但没有这样的运气.
以下代码无法编译:
val userById = for {
uid <- Parameters[Long]
u <- Users if u.id === uid
} yield u
val userFirstNameById = for {
uid <- Parameters[Long]
u <- userById(uid)
---------------^
// type mismatch; found : scala.slick.lifted.Column[Long] required: Long
} yield u.name
Run Code Online (Sandbox Code Playgroud) 我想找出以下哪个查询对于获取表上的行计数最有效,所以我正在尝试打印出select语句.我知道你可以添加.selectStatement到Queryable但不知道这是否告诉我完整的事实,因为我必须删除结果生成代码,例如.list.length并替换它.selectStatement.Slick可能会发现你正在寻找长度并进一步优化,所以我想查看整个查询的select语句,包括因为的生成的SQL .list.length,或者.count).first
Query(MyTable).list.length
(for{mt <- MyTable} yield mt).list.length
(for{mt <- MyTable} yield mt.count).first
Run Code Online (Sandbox Code Playgroud) 我发现了一个老问题"如何使用Play框架来开发Web服务"
我正在尝试使用Play 2.0和Scala来做同样的事情.除了从Groovy模板迁移到Scala模板之外,Play 2.0上的所有内容是否仍然相同?
一个新的例子将不胜感激.
我正在评估使用Scala的Play2-mini开发服务的可能性,该服务将位于移动客户端和现有Web服务之间.我正在寻找一个代码片段的最简单的例子,其中Play2-mini实现了服务器和客户端.理想情况下,客户端将使用Akka2 actor.
有了这个问题,我试图找出它是如何完成的,同时也看看Play2-Mini和Akka2应该如何合作.由于Play2-Mini似乎是Akka HTTP模块的替代品.
Play2-mini包含以下代码示例,其中我创建了两个TODO.如果有人可以帮助我开始使用一些示例代码,我将非常感激.
package com.example
import com.typesafe.play.mini._
import play.api.mvc._
import play.api.mvc.Results._
object App extends Application {
def route = {
case GET(Path("/testservice")) & QueryString(qs) => Action{ request=>
println(request.body)
//TODO Take parameter and content from the request them pass it to the back-end server
//TODO Receive a response from the back-end server and pass it back as a response
Ok(<h1>Server response: String {result}</h1>).as("text/html")
}
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在与Scala中解析JSON字符串的功能方法的概念作斗争,并在返回选项(某物)的情况下平放到墙上.我弹出问题,有用的答案流入.
问题是,作为Scala的新手,有什么正确的方法?
目前我这样做:
import util.parsing.json.JSON._
object JsonSoap {
def main(args: Array[String]) {
val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")
val y = x collect {
case m: Map[_, _] => m collect {
case (key: String, value: String) => key -> value
}
}
val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
yield {
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Person>
<Name>{name}</Name>
<Surname>{surname}</Surname>
</Person>
</soap:Body>
</soap:Envelope>
}
println(z)
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然坚持使用Some()
解决我的问题有一个很好的模式吗?当然,这必须是一个很好的探索领域.我该如何改进我的代码?
对于这样的XML代码段:
val fruits =
<fruits>
<fruit>
<name>apple</name>
<taste>ok</taste>
</fruit>
<fruit>
<name>banana</name>
<taste>better</taste>
</fruit>
</fruits>
Run Code Online (Sandbox Code Playgroud)
做类似的事情:
fruits \\ "fruit"
Run Code Online (Sandbox Code Playgroud)
将返回一个类型序列,scala.xml.NodeSeq其中包含所有水果和子节点.
将此转换为JSON对象列表的最佳方法是什么?我正在尝试将我的水果列表发送回浏览器.我一看scala.util.parsing.json.JSONObject和scala.util.parsing.json.JSONArray,但我不知道如何从NodeSeq获得后者的任何人.
如果可能的话,我很想看看它是如何使用普通的Scala代码完成的.
在使用尾递归示例进行操作时,我注意到正常递归调用和尾递归调用的结果之间存在小的差异:
scala> def fact(n: Int): Double = if(n < 1) 1 else n * fact(n - 1)
fact: (n: Int)Double
scala> fact(30)
res31: Double = 2.6525285981219103E32
scala> @tailrec def fact(n: Int, acc: Double = 1): Double = if(n < 1) acc else fact(n - 1, n * acc)
fact: (n: Int, acc: Double)Double
scala> fact(30)
res32: Double = 2.652528598121911E32
Run Code Online (Sandbox Code Playgroud)
出于好奇,有人可以向我解释为什么或在哪里进行四舍五入.我的猜测是因为Scala编译器将尾递归版本转换为循环,所以acc在循环的每次迭代中都会分配参数,并且小的舍入错误会在那里滑动.
我有以下build.sbt文件:
version := "0.1"
scalaVersion := "2.10.0-RC1"
scalacOptions := Seq("-unchecked", "-deprecation", "-encoding", "utf8")
resolvers ++= Seq(
"sonatype releases" at "https://oss.sonatype.org/content/repositories/releases/",
"sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/",
"typesafe repo" at "http://repo.typesafe.com/typesafe/releases/",
"spray repo" at "http://repo.spray.io/"
)
libraryDependencies ++= Seq(
"io.spray" % "spray-can" % "1.1-M4.2"
,"io.spray" % "spray-routing" % "1.1-M4.2"
,"io.spray" % "spray-testkit" % "1.1-M4.2"
,"io.spray" %% "spray-json" % "1.2.2" cross CrossVersion.full
,"com.typesafe.akka" %% "akka-actor" % "2.1.0-RC1" cross CrossVersion.full
,"org.specs2" %% "specs2" % "1.12.2" % "test" cross CrossVersion.full
,"com.typesafe" % "slick_2.10.0-RC1" % "0.11.2"
,"com.h2database" …Run Code Online (Sandbox Code Playgroud) 在我的代码中添加简单的电子邮件验证,我创建了以下函数:
def isValid(email: String): Boolean = if("""(?=[^\s]+)(?=(\w+)@([\w\.]+))""".r.findFirstIn(email) == None)false else true
Run Code Online (Sandbox Code Playgroud)
这将通过电子邮件喜欢bob@testmymail.com和失败的邮件bobtestmymail.com,但邮件与空格字符滑过,就像bob @testmymail也将返回true.
我可能在这里很傻......