- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力使用 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 =
url.openConnection.asInstanceOf[java.net.HttpURLConnection]
try {
conn.setRequestMethod("POST")
conn.setDoOutput(true)
conn.setRequestProperty("Content-Length", outs.length.toString)
conn.setRequestProperty("Content-Type", "text/xml")
conn.getOutputStream.write(outs)
conn.getOutputStream.close
Some(XML.load(conn.getInputStream))
}
catch {
case e: Exception => error("post: " + e)
error("post:" +
scala.io.Source.fromInputStream(conn.getErrorStream).mkString)
None
}
}
def sendWithFinagle(host: String, path: String, req: Elem) = {
val clientService: Service[HttpRequest, HttpResponse] =
ClientBuilder()
.codec(Http())
.hosts(new InetSocketAddress(host, 80))
.hostConnectionLimit(1)
.build()
val request: HttpRequest = new
DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/")
val soapPacket: String = wrap(req)
request.setContent(ChannelBuffers.copiedBuffer(soapPacket, UTF_8))
request.setHeader("Content-Lenght", soapPacket.length())
request.setHeader("Content-Type", "text/xml")
request.setUri("path")
val client = clientService(request)
val response = client.get()
println(response)
}
}
object SoapTest {
def testWithJavaNetURL {
val host = "https://apitest.authorize.net/soap/v1/Service.asmx"
val req = <IsAlive xmlns="https://api.authorize.net/soap/v1/"/>
val cli = new SoapClient
println("##### Test with Java Net URL: request:\n" +
cli.wrap(req))
val resp = cli.sendWithJavaNetURL(host, req)
if (resp.isDefined) {
println("##### response:\n" + resp.get.toString)
}
}
def testWithFinagle {
val host = "apitest.authorize.net"
val path = "/soap/v1/Service.asmx"
val req = <IsAlive xmlns="https://api.authorize.net/soap/v1/"/>
val cli = new SoapClient
println("##### Test with Finagle: request:\n" + cli.wrap(req))
cli.sendWithFinagle(host, path, req)
}
def main(args: Array[String]) {
testWithJavaNetURL
testWithFinagle
}
最佳答案
Jean-Phillippe,来自 Finagles forum ,请提供 answer on github
这是完整的工作且经过良好更新的代码:
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, RequestBuilder};
import org.jboss.netty.handler.codec.http._
import org.jboss.netty.buffer.ChannelBuffers.wrappedBuffer
import java.net.URL
class SoapClient {
private def error(msg: String) = {
println("SoapClient error: " + msg)
}
def wrap(xml: Elem): String = {
val wrapper = <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
{xml}
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
wrapper.toString
}
def sendWithJavaNetURL(host: String, req: Elem): Option[Elem] = {
val url = new java.net.URL(host)
val outs = wrap(req).getBytes
val conn =
url.openConnection.asInstanceOf[java.net.HttpURLConnection]
try {
conn.setRequestMethod("POST")
conn.setDoOutput(true)
conn.setRequestProperty("Content-Length", outs.length.toString)
conn.setRequestProperty("Content-Type", "text/xml")
conn.getOutputStream.write(outs)
conn.getOutputStream.close
Some(XML.load(conn.getInputStream))
}
catch {
case e: Exception => error("post: " + e)
error("post:" +
scala.io.Source.fromInputStream(conn.getErrorStream).mkString)
None
}
}
def sendWithFinagle(host: String, path: String, req: Elem) = {
val clientService: Service[HttpRequest, HttpResponse] =
ClientBuilder()
.codec(Http())
.hosts(new InetSocketAddress(host, 443))
.tls(host)
.hostConnectionLimit(1)
.build()
val payload = wrap(req).getBytes("UTF-8")
val request: HttpRequest = RequestBuilder().url(new URL("https", host, 443, path))
.setHeader("Content-Type", "text/xml")
.setHeader("Content-Length", payload.length.toString)
.buildPost(wrappedBuffer(payload))
val client = clientService(request)
for(response <- client) {
println(response)
println(response.getContent.toString("UTF-8"))
}
// val response = client.get()
}
}
object SoapTest {
def testWithJavaNetURL {
val host = "https://apitest.authorize.net/soap/v1/Service.asmx"
val req = <IsAlive xmlns="https://api.authorize.net/soap/v1/"/>
val cli = new SoapClient
println("##### Test with Java Net URL: request:\n" +
cli.wrap(req))
val resp = cli.sendWithJavaNetURL(host, req)
if (resp.isDefined) {
println("##### response:\n" + resp.get.toString)
}
}
def testWithFinagle {
val host = "apitest.authorize.net"
val path = "/soap/v1/Service.asmx"
val req = <IsAlive xmlns="https://api.authorize.net/soap/v1/"/>
val cli = new SoapClient
println("##### Test with Finagle: request:\n" + cli.wrap(req))
cli.sendWithFinagle(host, path, req)
}
def main(args: Array[String]) {
testWithJavaNetURL
testWithFinagle
}
}
SoapTest.main(Array[String]())
关于scala - 使用 Finagle 构建简单的 Scala SOAP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9277514/
在 Finagle 中,如何以安全、干净的方式创建带有参数的 HTTP GET 请求? val request = RequestBuilder() .url("http://www.exampl
本文整理了Java中zipkin2.finagle.ZipkinTracer类的一些代码示例,展示了ZipkinTracer类的具体用法。这些代码示例主要来源于Github/Stackoverflow
我有一个 Finagle 服务器,显然无法知道何时重新启动。 有这个代码 esbMockServer = Some(defaultServer .serve(s"localhost:$
我有一个裸 sbt 项目,我添加了 "com.twitter"%% "finagle-http"% "6.33.0"。我正在关注 quickstart Twitter Finagle 指南。我的代码是
我是 Finagle 的初学者。 今天我试着用 finagle-websocket 拼凑一个 hello world ,但我不明白为什么,当我运行它时,它不会阻止监听并死掉。 测试WS.scala:
Finagle 中使用的 Netty 使用“处理程序”管道来顺序处理输入和输出数据。 Netty 示例和包含的库显示了用于身份验证、协议(protocol)编解码器和服务的实际业务逻辑等各种处理程序。
我在 Finagle 客户端重试方面遇到困难。由于某种原因,即使我使用自定义分类器,客户端也不会在测试中重试失败的请求,该分类器应将 200 以外的任何响应代码标记为 RetryableFailure
我正在开发一款回合制策略游戏,我正在尝试进行多人游戏部分。我从来没有做过类似的事情,但我收到了使用 rpc 的强烈建议。我的多人游戏将托管在主服务器上,基本上玩家发送他所做的并接收游戏的新状态。如果我
我使用 Finalge https://twitter.github.io/finagle/ 来测试这样的超时情况: 服务器端:在RPC定义中,休眠10秒然后返回。 客户端:使用 within 调用
本文整理了Java中zipkin2.finagle.ZipkinTracer.close()方法的一些代码示例,展示了ZipkinTracer.close()的具体用法。这些代码示例主要来源于Gith
本文整理了Java中com.twitter.finagle.zookeeper.ZookeeperServerSetCluster类的一些代码示例,展示了ZookeeperServerSetClust
我在实践中没有使用过 Finagle 或 Akka,但我已经阅读了很多关于它们的内容。 Finagle 是一个 RPC 系统,而 Akka 是一个用于高并发应用程序的工具包,为什么所有人都将它们作为两
我正在使用 scrooge + thrift 来生成我的服务器和客户端代码。到目前为止一切正常。 这是我如何使用我的客户端的一个简化示例: private lazy val client = Th
当对同一端点进行多次调用时,Twitter Finagle 库似乎使用了缓存。通常这会很好,但它不利于自动化测试。有缓存吗,可以关掉吗? 最佳答案 Finagle 没有这样的缓存... 关于java
我的服务器使用的是 TLSv1.2 并且需要客户端证书才能连接。我可以使用 CURL 向服务器发送请求(这个请求工作正常): curl --data "SAMPLETEXT" https://myse
我是 Finagle 的新手。我现在正在阅读某人的代码,发现 Future 对象在不同的连接操作中被重用。我的问题是,这会导致 Future 对象被执行多次(在每个连接中),还是只会执行一次并存储
本文整理了Java中com.twitter.finagle.common.zookeeper.ZooKeeperClient类的一些代码示例,展示了ZooKeeperClient类的具体用法。这些代码
我正在开发一个微服务系统,该系统是在 Scala 中以 Finagle 和 Thrift 作为平台实现的。 由于有一些服务已经有一段时间没有人接触了,我需要查明它们是否已经被使用(或者更确切地说,哪些
在twitter的finagle中,有一个过滤器的概念,它们可以组合起来应用在服务上,为服务添加功能,比如添加超时或重试,概念和例子可以在这里找到:http://twitter.github.io/f
我正在努力获取从网页发送到我的服务器的 JSON 字符串。 在网页中,我执行以下操作: $.ajax({ type: "POST", url: url, data:
我是一名优秀的程序员,十分优秀!