我目前正在将所有Rest测试移动到CI服务器,并注意到所有测试都因SSL握手而失败,现在我已经使用我们的Java测试套件成功禁用了TrustManager,但我不确定如何使用Scala调度库来完成它,并且还没有找到可以在这种情况下应用的许多示例.
val JSONstr = "{samplekey:samplevalue}"
val response:String = Http(url("https://www.host.com/path/to/post")
<< (checkInJSONstr, "application/json") as_str)
Run Code Online (Sandbox Code Playgroud)
正如预期发生以下异常:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
...
Run Code Online (Sandbox Code Playgroud)
有没有办法干净地语法上忽略使用调度库的SSL?
在使用Databinder Dispatch使用Json进行编码的示例中,Nathan使用了一个没有方法的Object(Http),如下所示:
import dispatch._
import Http._
Http("http://www.fox.com/dollhouse/" >>> System.out )
Run Code Online (Sandbox Code Playgroud)
他是怎么做到的?
谢谢你所有的答案,不幸的是我不够具体......
看起来它只是将一个参数传递给类或伴随对象Http的构造函数.
在另一个例子中,我看到了另一种形式:
http = new Http
http(/* argument here */)
Run Code Online (Sandbox Code Playgroud)
这是有效的Scala吗?我想它一定是,因为作者是Scala专家.但这对我没有意义.动作通常通过调用对象上的方法来执行,无论是显式地为object.doSomething()还是隐式地为object = something(使用语法糖下的apply()方法).
我能想到的是构造函数除了用于构造对象之外还用于执行某些操作.换句话说,它具有副作用,例如在这种情况下,在网络上做一些事情.
我在使用 Dispatch 和 Scala 使用 JSON 对象发出 POST 请求时遇到问题。
POST 请求肯定可以正常工作,因为我使用 curl 对其进行了测试:
~/workspace $ curl -vd 'tracker={"project":"campaign","event":"home","number":"100"}' http://exampleurl:8145/test
Run Code Online (Sandbox Code Playgroud)
我得到了预期的 HTTP 200 响应
但是当我尝试使用 Dispatch 库(http://dispatch.databinder.net/Dispatch.html)做同样的事情时:
scala> Http(url("http://exampleurl:8145/test") << "tracker={'project':'campaign','event':'home','number':'100'}" >|)
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
dispatch.StatusCode: Unexpected response code: 404
Paramerter missing: [tracker] not found
at dispatch.HttpExecutor$$anonfun$when$1.apply(executor.scala:53)
at dispatch.HttpExecutor$$anonfun$when$1.apply(executor.scala:50)
at dispatch.HttpExecutor$$anonfun$x$2.apply(executor.scala:41)
at dispatch.HttpExecutor$$anonfun$x$2.apply(executor.scala:36)
at dispatch.BlockingHttp$$anonfun$execute$1.apply(Http.scala:54)
at dispatch.Http.pack(Http.scala:25)
at dispatch.BlockingHttp$class.execute(Http.scala:53)
at dispatch.Http.execute(Http.scala:21)
at dispatch.HttpExecutor$class.x(executor.scala:36)
at dispatch.Http.x(Http.scala:21)
at dispatch.HttpExecutor$class.when(executor.scala:50)
at dispatch.Http.when(Http.scala:21)
at dispatch.HttpExecutor$class.apply(executor.scala:60)
at dispatch.Http.apply(Http.scala:21)
at .<init>(<console>:11)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>) …Run Code Online (Sandbox Code Playgroud) 我正在关注调度文档中的第一个示例-
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc OK as.String)
for (c <- country)
println(c)
Run Code Online (Sandbox Code Playgroud)
我没有打印任何输出.当我将其更改为下面以进行阻塞调用时,我得到输出.
val res = country()
println(res)
Run Code Online (Sandbox Code Playgroud)
需要帮助.
完整的程序 -
import dispatch._
object DispatchTest {
def main(args: Array[String]) {
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc OK as.String)
for (c <- country)
println(c)
}
}
Run Code Online (Sandbox Code Playgroud) 从webapp的客户端,我点击了服务器端路由,它只是第三方API的包装器.使用dispatch,我试图让服务器端请求返回第三方API到客户端AJAX调用的确切头和响应.
当我这样做:
val req = host("third-pary.api.com, 80)
val post = req.as("user", "pass") / "route" << Map("key" -> "akey", "val" -> "aval")
Http(post > as.String)
Run Code Online (Sandbox Code Playgroud)
我总是看到一个200响应返回到AJAX调用(有点预期).我已经看到了Either使用的语法,但我真的更像是一个Any,因为它只是确切的响应和标题.怎么写?
我应该提到我在服务器端使用Scalatra,因此本地路由是:
post("/route") {
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我正在玩的建议的Either匹配示例,但match语法没有意义 - 我不在乎是否有错误,我只想返回它.此外,我似乎无法使用此方法返回BODY.
val asHeaders = as.Response { response =>
println("BODY: " + response.getResponseBody())
scala.collection.JavaConverters.mapAsScalaMapConverter(
response.getHeaders).asScala.toMap.mapValues(_.asScala.toList)
}
val response: Either[Throwable, Map[String, List[String]]] =
Http(post > asHeaders).either()
response match {
case Left(wrong) =>
println("Left: " + wrong.getMessage())
// return Action with …Run Code Online (Sandbox Code Playgroud) 我将使用Dispatch编写一个简单的HTTP客户端.我打电话dispatch.Http给未来,并呼吁未来得到回应
val request = ... val future = Http(request) // call the server asynchronously val response = future() // wait for the response from the server
现在我想知道如何等待超时.我想最后一次API调用是:
// throw an exception if no response received within timeout val response = future(timeout: Long)
是否有意义 ?
我理解Dispatch返回scala.concurrent.Future,它不提供API超时.你会如何建议我实施它?
我想从调度请求中获取正文和标头。这该怎么做?
val response = Http(request OK as.String)
for (r <- response) yield {
println(r.toString) //prints body
// println(r.getHeaders) // ???? how to print headers here ????
}
Run Code Online (Sandbox Code Playgroud) 尝试使用未正确配置的SSL证书时,我收到以下错误:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:562)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
at dispatch.BlockingHttp$class.dispatch$BlockingHttp$$execute(Http.scala:45)
at dispatch.BlockingHttp$$anonfun$execute$1$$anonfun$apply$3.apply(Http.scala:58)
at dispatch.BlockingHttp$$anonfun$execute$1$$anonfun$apply$3.apply(Http.scala:58)
at scala.Option.getOrElse(Option.scala:108)
at dispatch.BlockingHttp$$anonfun$execute$1.apply(Http.scala:58)
at dispatch.Http.pack(Http.scala:25)
at dispatch.BlockingHttp$class.execute(Http.scala:53)
at dispatch.Http.execute(Http.scala:21)
at dispatch.HttpExecutor$class.x(executor.scala:36)
at dispatch.Http.x(Http.scala:21)
at dispatch.HttpExecutor$class.when(executor.scala:50)
at dispatch.Http.when(Http.scala:21)
at dispatch.HttpExecutor$class.apply(executor.scala:60)
at dispatch.Http.apply(Http.scala:21)
at com.secondmarket.cobra.lib.delegate.UsersBDTest.tdsGet(UsersBDTest.scala:130)
at com.secondmarket.cobra.lib.delegate.UsersBDTest.setup(UsersBDTest.scala:40)
Run Code Online (Sandbox Code Playgroud)
我想完全忽略证书.
更新:我理解有关不正确配置的SSL证书的技术问题,问题不在于我们的盒子,而是我们正在使用的服务.它主要发生在测试盒而不是prod/stg上,因此我们正在调查但需要测试API.
scala ×8
http ×2
ssl ×2
concurrency ×1
databinder ×1
header ×1
https ×1
json ×1
post ×1
request ×1