我一直在客户端使用Databinder Dispatch库来获得一个简单的REST-ish API。我知道如何检测我是否收到错误状态的HTTP响应:
Http x (request) {
case (200, _, _, content) => successResult(content())
case (404, _, _, _) => notFoundErrorResult
case (_, _, _, _) => genericErrorResult
}
但是,由于域无效或连接失败,我如何区分错误响应和完全没有响应的错误?有没有办法在仍然使用同步语义的同时实现超时?如果API中有任何相关内容,我就错过了。
答案 0 :(得分:15)
还有一种更优雅的方法来使用Http.configure
方法配置客户端,该方法接收Builder => Builder
函数作为参数:
val http = Http.configure(_.setAllowPoolingConnection(true).setConnectionTimeoutInMs(5000))
答案 1 :(得分:4)
Periodic Table告诉我们>!
设置了一个异常监听器,最近的邮件列表主题解释了how to set a timeout。
然后,你可以做一些类似的事情:
val http = new dispatch.Http {
import org.apache.http.params.CoreConnectionPNames
client.getParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000)
client.getParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
}
http(req >! {
case e => // ...
})
请注意,我没有测试过这个......
答案 2 :(得分:3)
如果您使用Dispatch reboot(使用AsyncHttpClient作为底层库),这就是您设置客户端配置的方式:
val myHttp = new dispatch.Http {
import com.ning.http.client._
val builder = new AsyncHttpClientConfig.Builder()
builder.setCompressionEnabled(true)
.setAllowPoolingConnection(true)
.setRequestTimeoutInMs(5000)
override lazy val client = new AsyncHttpClient(builder.build())
}
然后只使用这个新对象,否则使用http
:
myHttp((url(baseUrl) <<? args) OK as.xml.Elem).either