Depois que o HttpClient foi atualizado para a versão 4.5, a API mudou muito. Depois do HttpClient 4, a API não ficou muito estável. Acho que, após a abstração da versão 4.5, muitas APIs devem estar estáveis em breve.
Para usar o HttpClient, geralmente você precisa definir o tempo limite de conexão e o tempo limite de dados. Esses dois parâmetros são muito importantes.O objetivo é evitar que seu aplicativo seja afetado devido ao tempo limite ao acessar outro http.
Na versão 4.5, as configurações desses dois parâmetros são abstraídas em RequestConfig e construídas pelo Builder correspondente. Os exemplos específicos são os seguintes:
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://stackoverflow.com/");
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000).setConnectionRequestTimeout(1000)
.setSocketTimeout(5000).build();
httpGet.setConfig(requestConfig);
CloseableHttpResponse response = httpclient.execute(httpGet);
System.out.println("得到的结果:" + response.getStatusLine());//得到请求结果
HttpEntity entity = response.getEntity();//得到请求回来的数据
setConnectTimeout: Defina o tempo limite de conexão em milissegundos.
setConnectionRequestTimeout: Defina o período de tempo limite para obter a Conexão do Connect Manager, em milissegundos. Este atributo é um atributo recém-adicionado, porque a versão atual pode compartilhar o pool de conexão.
setSocketTimeout: O período de tempo limite para solicitar a obtenção de dados, em milissegundos. Se você acessar uma interface e deixar de retornar dados por um determinado período, você simplesmente abandonará a chamada.
=================================================
Eu encontrei um problema ontem e precisava definir o período de tempo limite de CloseableHttpClient. Verifiquei o documento oficial a seguir.
Crie um novo RequestConfig:
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(5000)
.setConnectTimeout(5000)
.setConnectionRequestTimeout(5000)
.setStaleConnectionCheckEnabled(true)
.build();
Esse tempo limite pode ser definido no nível do cliente como o valor padrão para todas as solicitações:
CloseableHttpClient httpclient = HttpClients.custom()
.setDefaultRequestConfig(defaultRequestConfig)
.build();
A solicitação não herda a configuração da solicitação no nível do cliente, portanto, ao personalizá-la, você precisa copiar a configuração padrão do cliente:
HttpGet httpget = new HttpGet("http://www.apache.org/");
RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
.setProxy(new HttpHost("myotherproxy", 8080))
.build();
httpget.setConfig(requestConfig);
O tempo limite para a versão 4.3 é assim:
public static String httpPost (String url, String jsonString) { // 设置 HTTP 请求 参数 String result = null ; HttpClient httpClient = new DefaultHttpClient (); HttpPost httpPost = novo HttpPost (url); tente { httpClient.getParams (). setParameter (CoreConnectionPNames. CONNECTION_TIMEOUT , 10000); // 设置 请求 超时 时间 10s StringEntity entity = new StringEntity (jsonString); entity.setContentEncoding ( "UTF-8" ); entity.setContentType ( "application / json" ); httpPost.setEntity (entidade); HttpEntity resEntity = httpClient.execute (httpPost) .getEntity (); resultado = EntityUtils.toString (resEntity, "UTF-8" ); } catch (Exception e) { logger .error ( "http 接口 调用 异常 : url é ::" + url, e); return null ; } finalmente { httpClient.getConnectionManager (). shutdown (); } resultado de retorno ; }
A versão 4.5.2 é assim:
public static String testTimeout (String url) {
// Definir parâmetros de solicitação HTTP
Resultado da string = nulo;
Cliente CloseableHttpClient = HttpClients.createDefault ();
HttpGet httpGet = novo HttpGet (url);
RequestConfig requestConfig = RequestConfig.custom ()
.setConnectTimeout (50000) .setConnectionRequestTimeout (10000)
.setSocketTimeout (50000) .build ();
httpGet.setConfig (requestConfig);
experimentar {
Resposta CloseableHttpResponse = client.execute (httpGet);
resultado = EntityUtils.toString (response.getEntity (), "UTF-8");
} catch (ClientProtocolException e) {
logger.error ("exceção de chamada de interface http: url é ::" + url, e);
return null;
} catch (exceção e) {
logger.error ("exceção de chamada de interface http: url é ::" + url, e);
return null;
} finalmente {
experimentar {
client.close ();
} catch (IOException e) {
logger.error ("exceção de chamada de interface http: url é ::" + url, e);
}
}
resultado de retorno;
}