2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Dans le développement de logiciels modernes, il est souvent nécessaire de communiquer avec des serveurs distants, par exemple pour obtenir ou envoyer des données. Apache HttpClient est une bibliothèque client HTTP Java populaire qui simplifie le traitement du lancement et de la réponse des requêtes HTTP.Cet article explique comment utiliser un fichier personnaliséHttpClientUtils
Classe pour utiliser Apache HttpClient pour lancer des requêtes POST et gérer le pool de connexions afin d'optimiser les performances.
public class HttpClientUtils {
// 静态常量和变量声明
private static final int MAX_TOTAL_CONN = 600;
private static final int MAX_CONN_PER_HOST = 300;
private static final int SOCKET_TIMEOUT = 5000;
private static final int CONNECTION_TIMEOUT = 200;
private static final int CONNECTION_MANAGER_TIMEOUT = 100;
private static CloseableHttpClient httpclient;
private static PoolingHttpClientConnectionManager connMrg;
private static String encoding = StandardCharsets.UTF_8.name();
private static Logger log = LoggerFactory.getLogger(HttpClientUtils.class);
private static final ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(2);
// 静态代码块,用于初始化 HttpClient 和连接管理器,并设置 JVM 退出时关闭 HttpClient
static {
init();
destroyByJvmExit();
}
// 初始化连接管理器和 HttpClient
private static void init() {
connMrg = new PoolingHttpClientConnectionManager();
connMrg.setMaxTotal(MAX_TOTAL_CONN);
connMrg.setDefaultMaxPerRoute(MAX_CONN_PER_HOST);
httpclient = HttpClients.custom()
.setConnectionManager(connMrg)
.setDefaultRequestConfig(HttpClientUtils.defaultRequestConfig())
.build();
// 定时任务,定期清理过期和空闲连接
scheduledService.scheduleAtFixedRate(() -> {
connMrg.closeExpiredConnections();
connMrg.closeIdleConnections(CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);
}, 0, CONNECTION_MANAGER_TIMEOUT, TimeUnit.MILLISECONDS);
}
// JVM 退出时关闭 HttpClient
private static void destroyByJvmExit() {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
httpclient.close();
} catch (IOException e) {
log.error("Error closing HttpClient: {}", e.getMessage());
}
}));
}
// 创建 HttpClientContext
private static HttpClientContext createContext() {
return HttpClientContext.create();
}
// 创建默认的 RequestConfig
private static RequestConfig defaultRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(CONNECTION_TIMEOUT)
.setSocketTimeout(SOCKET_TIMEOUT)
.setConnectionRequestTimeout(CONNECTION_MANAGER_TIMEOUT)
.build();
}
// 发起带参数的 POST 表单请求,返回字符串结果
public static String postWithParamsForString(String url, List<NameValuePair> params) {
HttpPost httpPost = new HttpPost();
try {
URI uri = new URIBuilder(url).build();
httpPost.setURI(uri);
httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));
return executeRequest(httpPost);
} catch (URISyntaxException | IOException e) {
log.error("Error executing POST request: {}", e.getMessage());
} finally {
httpPost.releaseConnection();
}
return null;
}
// 发起 GET 请求,返回字符串结果
public static String get(String url, List<NameValuePair> params) {
HttpGet httpGet = new HttpGet();
try {
URI uri = new URIBuilder(url).setParameters(params).build();
httpGet.setURI(uri);
return executeRequest(httpGet);
} catch (URISyntaxException | IOException e) {
log.error("HTTP GET request failed", e);
} finally {
httpGet.releaseConnection();
}
return null;
}
// 发起 Post 请求,返回字符串结果
public static String post(String url, List<NameValuePair> params) {
HttpPost httpPost = new HttpPost();
try {
httpPost.setURI(new URI(url));
httpPost.setEntity(new UrlEncodedFormEntity(params, StandardCharsets.UTF_8));
return executeRequest(httpPost);
} catch (URISyntaxException | IOException e) {
log.error("HTTP POST request failed", e);
} finally {
httpPost.releaseConnection();
}
return null;
}
// 执行 HTTP 请求并处理响应
private static String executeRequest(HttpUriRequest request) throws IOException {
try (CloseableHttpResponse response = httpclient.execute(request, createContext())) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
return EntityUtils.toString(entity, encoding);
} else {
log.warn("Empty response entity");
}
} else {
log.error("HTTP request failed with status code: {}", statusCode);
}
} catch (IOException e) {
log.error("HTTP request execution failed: {}", e.getMessage());
throw e;
}
return null;
}
}
constantes et variables statiques:
Initialisation et destruction:
HttpClient
et gestionnaire de connexionPoolingHttpClientConnectionManager
。ScheduledExecutorService
Nettoyez régulièrement les connexions expirées et inactives.destroyByJvmExit
Dans la méthode, un hook de sortie JVM est enregistré pour garantir qu'il est fermé lorsque la JVM est arrêtée.HttpClient
。Méthode de requête HTTP:
postWithParamsForString
La méthode est utilisée pour effectuer une requête POST avec des paramètres.HttpPost
Créez la requête, définissez l'URL et les paramètres de la requête, et enfin appelezexecuteRequest
Requête d'exécution de méthode.Exécuter les demandes et traiter les réponses:
executeRequest
Méthode de réceptionHttpUriRequest
, effectuez des requêtes HTTP et traitez les réponses.utiliser HttpClientUtils
Les classes peuvent simplifier l'écriture et la gestion des requêtes HTTP. Les étapes spécifiques sont les suivantes :
public class Main {
public static void main(String[] args) {
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("param1", "value1"));
params.add(new BasicNameValuePair("param2", "value2"));
String response = HttpClientUtils.postWithParamsForString("http://example.com/api", params);
if (response != null) {
System.out.println("Response: " + response);
} else {
System.err.println("Failed to execute POST request");
}
}
}
Grâce à l'apprentissage ci-dessus, vous devriez maintenant comprendre comment utiliser HttpClientUtils
Classe pour gérer les clients HTTP et lancer des requêtes. Cette approche peut vous aider à gérer plus efficacement les communications HTTP dans les applications Java, tout en améliorant les performances et la stabilité grâce au regroupement de connexions et aux mécanismes de nettoyage périodiques.