====== Apache Http Client ====== * [[http://hc.apache.org/|Apache Http Client]] * [[https://hc.apache.org/httpclient-3.x/preference-api.html|HttpClient 3.x preference api]] * [[https://hc.apache.org/httpcomponents-core-5.1.x/|Apache HttpComponents – HttpCore Overview]] * [[https://hc.apache.org/httpcomponents-client-5.1.x/current/httpclient5-fluent/clirr-report.html|Apache HttpComponents – HttpClient Overview]] ===== Connection 갯수 ===== * HttpClient는 하나의 IP 혹은 domain name에 대한 접속 갯수가 기본적으로 5개로 제한돼 있다. * 고부하 서비스의 경우 이 갯수를 늘려줘야 한다. HttpClient httpClient = HttpClientBuilder.create().useSystemProperties() .setMaxConnTotal([최대 커넥션 갯수]) .setMaxConnPerRoute([IP/domain name당 최대 커넥션 갯수]) .... ===== Connection/Socket Timeout ===== * [[http://www.baeldung.com/httpclient-timeout|HttpClient timeout]] int timeout = 5; RequestConfig config = RequestConfig.custom() .setConnectTimeout(timeout * 1000) .setConnectionRequestTimeout(timeout * 1000) .setSocketTimeout(timeout * 1000).build(); CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); * connectionTimeout : 서버에 소켓 연결을 맺을 때의 타임아웃 * connectionRequestTimeout : ConnectionManager(커넥션풀)로부터 꺼내올 때의 타임아웃 * socketTimeout : 요청/응답간의 타임아웃. ===== Evict Idle Connections ===== * KeepAlive 설정이 있을 경우, 서버에서 KeepAlive 시간 동안 사용되지 않은 커넥션(idle connection)을 죽이는 일이 생고 이를 ''HttpClient''가 인지하지 못해서 클라이언트측에서 오류가 발생할 수 있다. * 클라이언트 측에서도 Idle Connection을 주기적으로 지워주면 된다. HttpClient httpClient = HttpClientBuilder.create(). .evictIdleConnections(2000L, TimeUnit.MILLISECONDS) .... .build(); * [[http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html#evictIdleConnections(long,%20java.util.concurrent.TimeUnit)|HttpClientBuilder.evictIdleConnections()]] 참조 >> Please note this method has no effect if the instance of HttpClient is configuted to use a shared connection manager. >> Please note this method may not be used when the instance of HttpClient is created inside an EJB container. ===== Request Character Encoding ===== ==== 일반 ==== HttpProtocolParams.setContentCharset(httpParams, "UTF-8"); ==== POST 요청시 URL Encoded Form ==== [[http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/entity/UrlEncodedFormEntity.html|UrlEncodedFormEntity]] 클래스 생성자에서 문자 인코딩 지정 HttpPost post = new HttpPost("http://...."); List params = new ArrayList<>(); params.add(new BasicNameValuePair("paramName", "param value")); // params... post.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); ===== HttpAsyncClient ===== * [[http://www.baeldung.com/httpasyncclient-tutorial|HttpAsyncClient tutorial]] ===== Stale Check ===== * Keep Alive 상태시 서버와 클라이언트 모두 접속중인 커넥션을 상대방에게 알리지 않고 접속을 끊을 수 있다. * Stale Check에 대해 각 버전별 버그 여부 등을 확인하고 올바로 설정해야 한다. * http://hc.apache.org/httpclient-3.x/performance.html > HTTP specification permits both the client and the server to terminate a persistent (keep-alive) connection at any time without notice to the counterpart, thus rendering the connection invalid or stale. By default HttpClient performs a check, just prior to executing a request, to determine if the active connection is stale. The cost of this operation is about 15-30 ms, depending on the JRE used. Disabling stale connection check may result in slight performance improvement, especially for small payload responses, at the risk of getting an I/O error when executing a request over a connection that has been closed at the server side. > > See the http.connection.stalecheck parameter documentation for more information. ===== 참조 ===== * [[https://www.baeldung.com/httpclient-timeout|HttpClient timeout | Baeldung]] * [[https://danlebrero.com/2019/12/11/apache-http-client-timeouts-config-production-asynchronous-http-client-pictures/|Apache Http Client and Asynchronous HTTP client timeouts explained in pictures]] * [[https://github.com/dakrone/clj-http|dakrone/clj-http: An idiomatic clojure http client wrapping the apache client. Offically supported version.]] * [[https://d2.naver.com/helloworld/0881672|nGrinder에 적용한 HttpCore 5와 HttpClient 5 살펴보기]]