使用 Groovy 的 HTTPBuilder,如何设置超时
Using Groovy's HTTPBuilder, how do you set timeouts
我正在尝试使用 Groovy HTTPBuilder 设置连接超时,但我一直找不到方法。
使用简单的 ol' URL 很简单:
def client = new URL("https://search.yahoo.com/search?q=foobar")
def result = client.getText( readTimeout: 1 )
这会引发 SocketTimeoutException,但这并不是我想要的。由于各种原因,我宁愿使用 HTTPBuilder 或更好的 RESTClient。
这确实有效:
def client = new HTTPBuilder()
def result = client.request("https://search.yahoo.com/", Method.GET, "*/*") { HttpRequest request ->
uri.path = "search"
uri.query = [q: "foobar"]
request.getParams().setParameter("http.socket.timeout", 1);
}
但是 request.getParams() 已被弃用。
我这辈子都找不到将正确的 RequestConfig 注入构建器的方法。
从 JavaDoc 看来,您是通过使用 AsyncHttpBuilder 来实现的? class 扩展了 HTTPBuilder 并且它有一个 setTimeout(int) 方法。
看看这个:http://www.kellyrob99.com/blog/2013/02/10/groovy-and-http/ According to that, it appears you might be able to follow the advice here to get a timeout on your connection:
试试这个,我用的是 0.7.1:
import groovyx.net.http.HTTPBuilder
import org.apache.http.client.config.RequestConfig
import org.apache.http.config.SocketConfig
import org.apache.http.conn.ConnectTimeoutException
import org.apache.http.impl.client.HttpClients
def timeout = 10000 // millis
SocketConfig sc = SocketConfig.custom().setSoTimeout(timeout).build()
RequestConfig rc = RequestConfig.custom().setConnectTimeout(timeout).setSocketTimeout(timeout).build()
def hc = HttpClients.custom().setDefaultSocketConfig(sc).setDefaultRequestConfig(rc).build()
def http = new HTTPBuilder('https://search.yahoo.com/')
http.client = hc
http.get(path:'/search')
我是这样用的
def timeOut = 10000
HTTPBuilder http = new HTTPBuilder('http://url.com')
http.client.params.setParameter('http.connection.timeout', new Integer(timeOut))
http.client.params.setParameter('http.socket.timeout', new Integer(timeOut))
纯 HTTPBuilder:
import org.apache.http.client.config.RequestConfig
def TIMEOUT = 10000
def defaultRequestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(TIMEOUT)
.setConnectTimeout(TIMEOUT)
.setSocketTimeout(TIMEOUT)
.build()
def client = new HTTPBuilder("uri")
client.setClient(HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build())
RESTClient 应有尽有:
import org.apache.http.auth.AuthScope
import org.apache.http.auth.UsernamePasswordCredentials
import org.apache.http.client.config.RequestConfig
import org.apache.http.conn.ssl.NoopHostnameVerifier
import org.apache.http.conn.ssl.SSLConnectionSocketFactory
import org.apache.http.conn.ssl.TrustSelfSignedStrategy
import org.apache.http.impl.client.BasicCredentialsProvider
import org.apache.http.impl.client.HttpClients
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager
import org.apache.http.ssl.SSLContextBuilder
def restClient = new RESTClient("hostname")
//timeout
def TIMEOUT = 5000
def defaultRequestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(TIMEOUT)
.setConnectTimeout(TIMEOUT)
.setSocketTimeout(TIMEOUT)
.build()
//basic user/password authentication
def credentials = new UsernamePasswordCredentials("admin", "password")
def credentialsProvider = new BasicCredentialsProvider()
credentialsProvider.setCredentials(AuthScope.ANY, credentials)
//set ssl trust all, no ssl exceptions
def sslContext = new SSLContextBuilder().loadTrustMaterial(null, TrustSelfSignedStrategy.INSTANCE).build()
def sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)
//multithreaded connection manager
def multithreadedConnectionManager = new PoolingHttpClientConnectionManager()
//build client with all this stuff
restClient.setClient(HttpClients.custom()
.setConnectionManager(multithreadedConnectionManager)
.setDefaultCredentialsProvider(credentialsProvider)
.setDefaultRequestConfig(defaultRequestConfig)
.setSSLSocketFactory(sslSocketFactory)
.build())
我正在尝试使用 Groovy HTTPBuilder 设置连接超时,但我一直找不到方法。
使用简单的 ol' URL 很简单:
def client = new URL("https://search.yahoo.com/search?q=foobar")
def result = client.getText( readTimeout: 1 )
这会引发 SocketTimeoutException,但这并不是我想要的。由于各种原因,我宁愿使用 HTTPBuilder 或更好的 RESTClient。
这确实有效:
def client = new HTTPBuilder()
def result = client.request("https://search.yahoo.com/", Method.GET, "*/*") { HttpRequest request ->
uri.path = "search"
uri.query = [q: "foobar"]
request.getParams().setParameter("http.socket.timeout", 1);
}
但是 request.getParams() 已被弃用。
我这辈子都找不到将正确的 RequestConfig 注入构建器的方法。
从 JavaDoc 看来,您是通过使用 AsyncHttpBuilder 来实现的? class 扩展了 HTTPBuilder 并且它有一个 setTimeout(int) 方法。
看看这个:http://www.kellyrob99.com/blog/2013/02/10/groovy-and-http/ According to that, it appears you might be able to follow the advice here to get a timeout on your connection:
试试这个,我用的是 0.7.1:
import groovyx.net.http.HTTPBuilder
import org.apache.http.client.config.RequestConfig
import org.apache.http.config.SocketConfig
import org.apache.http.conn.ConnectTimeoutException
import org.apache.http.impl.client.HttpClients
def timeout = 10000 // millis
SocketConfig sc = SocketConfig.custom().setSoTimeout(timeout).build()
RequestConfig rc = RequestConfig.custom().setConnectTimeout(timeout).setSocketTimeout(timeout).build()
def hc = HttpClients.custom().setDefaultSocketConfig(sc).setDefaultRequestConfig(rc).build()
def http = new HTTPBuilder('https://search.yahoo.com/')
http.client = hc
http.get(path:'/search')
我是这样用的
def timeOut = 10000
HTTPBuilder http = new HTTPBuilder('http://url.com')
http.client.params.setParameter('http.connection.timeout', new Integer(timeOut))
http.client.params.setParameter('http.socket.timeout', new Integer(timeOut))
纯 HTTPBuilder:
import org.apache.http.client.config.RequestConfig
def TIMEOUT = 10000
def defaultRequestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(TIMEOUT)
.setConnectTimeout(TIMEOUT)
.setSocketTimeout(TIMEOUT)
.build()
def client = new HTTPBuilder("uri")
client.setClient(HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build())
RESTClient 应有尽有:
import org.apache.http.auth.AuthScope
import org.apache.http.auth.UsernamePasswordCredentials
import org.apache.http.client.config.RequestConfig
import org.apache.http.conn.ssl.NoopHostnameVerifier
import org.apache.http.conn.ssl.SSLConnectionSocketFactory
import org.apache.http.conn.ssl.TrustSelfSignedStrategy
import org.apache.http.impl.client.BasicCredentialsProvider
import org.apache.http.impl.client.HttpClients
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager
import org.apache.http.ssl.SSLContextBuilder
def restClient = new RESTClient("hostname")
//timeout
def TIMEOUT = 5000
def defaultRequestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(TIMEOUT)
.setConnectTimeout(TIMEOUT)
.setSocketTimeout(TIMEOUT)
.build()
//basic user/password authentication
def credentials = new UsernamePasswordCredentials("admin", "password")
def credentialsProvider = new BasicCredentialsProvider()
credentialsProvider.setCredentials(AuthScope.ANY, credentials)
//set ssl trust all, no ssl exceptions
def sslContext = new SSLContextBuilder().loadTrustMaterial(null, TrustSelfSignedStrategy.INSTANCE).build()
def sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)
//multithreaded connection manager
def multithreadedConnectionManager = new PoolingHttpClientConnectionManager()
//build client with all this stuff
restClient.setClient(HttpClients.custom()
.setConnectionManager(multithreadedConnectionManager)
.setDefaultCredentialsProvider(credentialsProvider)
.setDefaultRequestConfig(defaultRequestConfig)
.setSSLSocketFactory(sslSocketFactory)
.build())