7

我一直在客户端中使用 Databinder Dispatch 库来实现简单的 REST 式 API。我知道如何检测是否收到带有错误状态的 HTTP 响应:

Http x (request) {
    case (200, _, _, content) => successResult(content())
    case (404, _, _, _) => notFoundErrorResult
    case (_, _, _, _) => genericErrorResult
}

但是,由于域无效或连接失败,我如何区分错误响应和无法获得任何响应?有没有办法在仍然使用同步语义的同时实现超时?如果 API 中有任何相关内容,我已经错过了。

4

3 回答 3

15

还有一种更优雅的方式来使用Http.configure接收Builder => Builder函数作为参数的方法来配置客户端:

val http = Http.configure(_.setAllowPoolingConnection(true).setConnectionTimeoutInMs(5000))
于 2013-03-26T07:47:38.580 回答
4

周期告诉我们>!设置了异常侦听器,最近的邮件列表线程解释了如何设置超时

那么,你可能会做这样的事情:

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 => // ...
})

请注意,我还没有测试过这个......

于 2012-03-13T00:13:09.073 回答
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
于 2012-08-29T01:49:56.060 回答