Apache HTTP Client ব্যবহার করে Custom HTTP Clients তৈরি করা হয় যখন আপনাকে কিছু বিশেষ কনফিগারেশন, যেমন custom timeouts, connection management, proxies, অথবা custom headers প্রয়োজন হয়। Apache HTTP Client এর মাধ্যমে HttpClient এবং HttpRequestConfig কনফিগারেশন ব্যবহার করে আপনি নিজের প্রয়োজন অনুসারে কাস্টম HTTP ক্লায়েন্ট তৈরি করতে পারেন।
কাস্টম HTTP ক্লায়েন্ট তৈরি করার জন্য HttpClientBuilder
ব্যবহার করা হয়, যা আপনাকে ক্লায়েন্টের কনফিগারেশন নির্ধারণ করতে সহায়ক হয়। আপনি connection timeout, socket timeout, max connections এবং আরও অনেক কিছু কনফিগার করতে পারেন।
setConnectionTimeToLive()
এবং setSocketTimeout()
ব্যবহার করে আপনি সংযোগ এবং সোকেট টাইমআউট নির্ধারণ করতে পারেন।PoolingHttpClientConnectionManager
ব্যবহার করে আপনি HTTP ক্লায়েন্টের জন্য connection pooling এবং max connections কনফিগার করতে পারেন।setProxy()
এবং setProxyCredentials()
ব্যবহার করে এটি কনফিগার করা যাবে।setDefaultHeaders()
ব্যবহার করে আপনি সাধারণভাবে সকল request-এ custom headers যোগ করতে পারেন।import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.HttpHost;
import org.apache.http.HttpHeaders;
import org.apache.http.util.EntityUtils;
import java.net.URI;
public class CustomHttpClientExample {
public static void main(String[] args) {
// Custom Configuration
int connectionTimeout = 5000; // 5 seconds
int socketTimeout = 10000; // 10 seconds
int maxConnections = 100;
// Connection Pooling Setup
PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
poolingConnManager.setMaxTotal(maxConnections); // Set max connections
poolingConnManager.setDefaultMaxPerRoute(20); // Set max connections per route
// RequestConfig Setup
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectionTimeout) // Connection timeout
.setSocketTimeout(socketTimeout) // Socket timeout
.build();
// HttpClientBuilder Setup with Pooling and Timeouts
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig) // Apply RequestConfig
.setConnectionManager(poolingConnManager) // Apply connection manager
.addInterceptorFirst((request, context) -> {
// Add Custom Header to each request
request.addHeader(HttpHeaders.USER_AGENT, "CustomHttpClient");
})
.build();
// Send a GET request
String url = "https://jsonplaceholder.typicode.com/posts";
try {
HttpGet httpGet = new HttpGet(URI.create(url));
// Custom Authentication or other Headers
httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer <your_token_here>");
// Send the request and receive the response
HttpResponse response = httpClient.execute(httpGet);
// Handle Response
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Response Code: " + statusCode);
HttpEntity entity = response.getEntity();
if (entity != null) {
String responseBody = EntityUtils.toString(entity);
System.out.println("Response Body: " + responseBody);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
PoolingHttpClientConnectionManager
ব্যবহার করে maxTotal এবং maxPerRoute সেট করা হয়, যা HTTP ক্লায়েন্টের জন্য কনেকশন পুল ম্যানেজমেন্ট নির্ধারণ করে।RequestConfig.custom()
এর মাধ্যমে connectTimeout এবং socketTimeout নির্ধারণ করা হয়।setConnectTimeout(connectionTimeout)
: ক্লায়েন্টের জন্য সর্বোচ্চ সময় যা অপেক্ষা করা হবে নতুন কনেকশন স্থাপনের জন্য।setSocketTimeout(socketTimeout)
: সার্ভার থেকে response পাওয়ার জন্য সর্বোচ্চ সময়।addInterceptorFirst()
ব্যবহার করে আপনি প্রতিটি request-এ custom headers (যেমন User-Agent) যোগ করতে পারেন।setProxy()
এবং setProxyCredentials()
ব্যবহার করে proxy সেটিংস কনফিগার করতে পারেন।Authorization
header-এ Bearer পাঠানো হয়।Custom HTTP Client তৈরি করার মাধ্যমে আপনি Apache HttpClient কে আপনার প্রয়োজন অনুসারে কনফিগার করতে পারেন। আপনি connection pooling, timeouts, custom headers, authentication এবং proxy settings কাস্টমাইজ করতে পারবেন। এর ফলে, আপনি আপনার HTTP ক্লায়েন্টের পারফরম্যান্স এবং নিরাপত্তা উন্নত করতে পারবেন।
অ্যাপাচি HTTP ক্লায়েন্টে কাস্টম HttpClient
কনফিগারেশন তৈরি করার মাধ্যমে আপনি আপনার HTTP রিকোয়েস্ট এবং রেসপন্সের নিয়ন্ত্রণ বাড়াতে পারেন। বিভিন্ন ধরনের কনফিগারেশন যেমন টাইমআউট, প্রোক্সি, অটেন্টিকেশন, রিট্রাই হ্যান্ডলার, কনেকশন পুলিং ইত্যাদি কাস্টমাইজ করা যায়। এটি একটি নমনীয় প্রক্রিয়া যা বিভিন্ন ধরনের নেটওয়ার্ক চাহিদা পূরণের জন্য ব্যবহার করা যেতে পারে।
এখানে কিছু সাধারণ কনফিগারেশন বিকল্প প্রদর্শিত হয়েছে, যেমন টাইমআউট, প্রোক্সি, কনেকশন পুলিং, এবং রিট্রাই হ্যান্ডলার কাস্টমাইজেশন।
import org.apache.http.HttpHost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.HttpResponse;
import org.apache.http.impl.client.HttpClientBuilder;
public class CustomHttpClientExample {
public static void main(String[] args) {
try {
// RequestConfig তৈরি করা (কানেকশন টাইমআউট, সোকেট টাইমআউট)
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000) // কানেকশন টাইমআউট
.setSocketTimeout(5000) // সোকেট টাইমআউট
.build();
// PoolingHttpClientConnectionManager তৈরি করা (কনেকশন পুলিং)
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(200); // সর্বোচ্চ কানেকশন সংখ্যা
connectionManager.setDefaultMaxPerRoute(20); // প্রতি রুটে সর্বোচ্চ কানেকশন সংখ্যা
// প্রোক্সি কনফিগারেশন (যদি প্রয়োজন হয়)
HttpHost proxy = new HttpHost("proxy.example.com", 8080);
requestConfig = RequestConfig.custom()
.setProxy(proxy)
.setConnectTimeout(5000)
.setSocketTimeout(5000)
.build();
// HttpClient তৈরি এবং কাস্টম কনফিগারেশন সেট করা
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig) // কনফিগারেশন যোগ করা
.setConnectionManager(connectionManager) // কানেকশন ম্যানেজার
.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)) // রিট্রাই হ্যান্ডলার
.build();
// HTTP GET রিকোয়েস্ট তৈরি
HttpGet httpGet = new HttpGet("http://example.com");
HttpResponse response = httpClient.execute(httpGet);
// রেসপন্স স্ট্যাটাস দেখানো
System.out.println("Response Status: " + response.getStatusLine().getStatusCode());
} catch (Exception e) {
e.printStackTrace();
}
}
}
যদি আপনি অতিরিক্ত কিছু কাস্টম সেটিংস যেমন SSL কনফিগারেশন, কাস্টম হেডার অথবা অটেন্টিকেশন অন্তর্ভুক্ত করতে চান, তাহলে তা নিম্নলিখিতভাবে করা যায়:
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.HttpResponse;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;
public class CustomHttpClientWithAuth {
public static void main(String[] args) {
try {
// Basic Authentication প্রোভাইডার তৈরি
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new org.apache.http.auth.AuthScope("example.com", 80),
new UsernamePasswordCredentials("user", "password"));
// HttpClient তৈরি এবং Basic Authentication কনফিগার করা
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultCredentialsProvider(credentialsProvider) // অটেন্টিকেশন প্রদানকারী
.build();
// HTTP GET রিকোয়েস্ট তৈরি
HttpGet httpGet = new HttpGet("http://example.com");
HttpResponse response = httpClient.execute(httpGet);
// রেসপন্স স্ট্যাটাস দেখানো
System.out.println("Response Status: " + response.getStatusLine().getStatusCode());
} catch (Exception e) {
e.printStackTrace();
}
}
}
কাস্টম HttpClient
কনফিগারেশন তৈরি করে, আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের জন্য একটি শক্তিশালী এবং নিরাপদ পরিবেশ তৈরি করতে পারেন। টাইমআউট, প্রোক্সি, কানেকশন পুলিং, অটেন্টিকেশন এবং রিট্রাই পলিসির মতো বিভিন্ন সেটিংস কাস্টমাইজ করা সম্ভব। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটি আরও নিয়ন্ত্রণযোগ্য এবং নিরাপদ করতে পারেন।
অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client) এ Custom Request/Response Interceptors ব্যবহৃত হয় রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়ার মধ্যে কাস্টম লজিক প্রয়োগ করতে। ইন্টারসেপ্টরগুলি ক্লায়েন্টের রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়াকে কাস্টমাইজ করতে এবং অতিরিক্ত ফিচার যেমন লগিং, কাস্টম হেডার অ্যাড করা, সিকিউরিটি চেক বা প্রোফাইলিং সম্পাদন করতে ব্যবহৃত হয়।
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.RequestConfig;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpRequestBase;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.HttpRequest;
import org.apache.http.HttpEntityEnclosingRequestBase;
import org.apache.http.impl.HttpClientBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.HttpResponseException;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.impl.client.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class CustomInterceptorExample {
public static void main(String[] args) {
try {
// Request Interceptor তৈরি করা (রিকুয়েস্টে কাস্টম হেডার যোগ করা)
HttpRequestInterceptor requestInterceptor = (request, context) -> {
request.addHeader("X-Custom-Header", "CustomHeaderValue");
System.out.println("Request Interceptor: Added custom header.");
};
// Response Interceptor তৈরি করা (রেসপন্সের স্ট্যাটাস কোড পর্যালোচনা)
HttpResponseInterceptor responseInterceptor = (response, context) -> {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 404) {
System.out.println("Response Interceptor: Resource not found (404).");
}
};
// RequestConfig কনফিগারেশন
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000) // কানেকশন টাইমআউট
.setSocketTimeout(5000) // সোকেট টাইমআউট
.build();
// HttpClient কনফিগারেশন (ইন্টারসেপ্টর সহ)
CloseableHttpClient httpClient = HttpClients.custom()
.addInterceptorFirst(requestInterceptor) // Request Interceptor যোগ করা
.addInterceptorLast(responseInterceptor) // Response Interceptor যোগ করা
.setDefaultRequestConfig(requestConfig) // RequestConfig কনফিগারেশন সেট করা
.build();
// HTTP GET রিকুয়েস্ট তৈরি করা
HttpGet request = new HttpGet("http://example.com");
// রিকুয়েস্ট পাঠানো এবং রেসপন্স গ্রহণ
CloseableHttpResponse response = httpClient.execute(request);
System.out.println("Response Status: " + response.getStatusLine().getStatusCode());
// রেসপন্স কন্টেন্ট
String responseContent = EntityUtils.toString(response.getEntity());
System.out.println("Response Content: " + responseContent);
response.close();
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
addHeader()
মেথড ব্যবহার করে একটি কাস্টম হেডার (X-Custom-Header
) যোগ করে। এটি ইন্টারসেপ্টরের ভিতরে যেকোনো পরিবর্তন বা কার্যকলাপ সম্পাদন করতে সক্ষম করে।addInterceptorFirst()
এবং addInterceptorLast()
: এগুলি HTTP ক্লায়েন্টের জন্য ইন্টারসেপ্টর যোগ করার পদ্ধতি। addInterceptorFirst()
ইন্টারসেপ্টরটি প্রথমে চলবে এবং addInterceptorLast()
ইন্টারসেপ্টরটি রিকুয়েস্ট প্রক্রিয়া শেষে চলবে।setDefaultRequestConfig(requestConfig)
: রিকুয়েস্টের জন্য টাইমআউট কনফিগার করা হয়েছে, যেমন কানেকশন এবং সোকেট টাইমআউট।httpClient.execute(request)
: HTTP GET রিকুয়েস্টটি প্রেরণ করা হয়েছে এবং রেসপন্সের স্ট্যাটাস কোড এবং কন্টেন্ট গ্রহণ করা হয়েছে।Custom Request/Response Interceptors অ্যাপাচি HTTP ক্লায়েন্টে আপনার রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়া কাস্টমাইজ করতে সহায়ক। রিকুয়েস্ট ইন্টারসেপ্টর আপনাকে কাস্টম হেডার বা কন্টেন্ট পরিবর্তন করতে দেয়, এবং রেসপন্স ইন্টারসেপ্টর আপনাকে রেসপন্সের স্ট্যাটাস কোড পর্যালোচনা বা কাস্টম লজিক প্রয়োগ করতে দেয়। এটি উন্নত লগিং, সিকিউরিটি, এবং অন্যান্য ফিচার যোগ করতে একটি শক্তিশালী সরঞ্জাম।
অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client) এ Custom Connection Manager এবং Retry Mechanism ব্যবহারের মাধ্যমে আপনি HTTP কানেকশন ব্যবস্থাপনা কাস্টমাইজ করতে পারেন এবং রিট্রাই অপশন সংযুক্ত করতে পারেন। এই দুটি ফিচার আপনাকে HTTP ক্লায়েন্টের পারফরম্যান্স এবং স্থিতিশীলতা উন্নত করতে সহায়ক।
Custom Connection Manager ব্যবহার করে আপনি HTTP কানেকশনগুলি আরও বেশি কাস্টমাইজ এবং নিয়ন্ত্রণ করতে পারেন। অ্যাপাচি HTTP ক্লায়েন্টে, আপনি কাস্টম কানেকশন ম্যানেজার তৈরি করে বিভিন্ন সার্ভারের সাথে কানেকশন পুল ম্যানেজ করতে পারবেন। এটি কার্যকর হতে পারে যখন আপনি একাধিক সার্ভারের সাথে কানেকশন তৈরি করতে চান বা নির্দিষ্ট সার্ভারের জন্য আলাদা প্যারামিটার ব্যবহার করতে চান।
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.pool.PoolStats;
import org.apache.hc.client5.http.impl.pool.BasicHttpClientConnectionManager;
import org.apache.hc.core5.pool.PoolEntry;
public class CustomConnectionManagerExample {
public static void main(String[] args) throws Exception {
// Custom connection manager তৈরি করা
BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager();
// Connection pool-এর পরিসংখ্যান দেখতে পারেন
PoolStats poolStats = connectionManager.getTotalStats();
System.out.println("Total connections: " + poolStats.getAvailable() + " available connections");
// HTTP ক্লায়েন্ট তৈরি করা
try (CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager) // Custom connection manager সেট করা
.build()) {
// GET অনুরোধ তৈরি করা
HttpGet request = new HttpGet("https://example.com");
// HTTP অনুরোধ পাঠানো
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println("HTTP Response Status Code: " + response.getCode());
}
}
}
}
BasicHttpClientConnectionManager
: এটি একটি কানেকশন ম্যানেজার যা HTTP কানেকশন পুল ম্যানেজমেন্ট করে।PoolStats
: এই ক্লাসটি পুলে থাকা সক্রিয় এবং উপলব্ধ কানেকশনগুলির পরিসংখ্যান প্রদান করে।Retry Mechanism অ্যাপাচি HTTP ক্লায়েন্টে খুবই গুরুত্বপূর্ণ, বিশেষত যখন সার্ভারটি অস্থির থাকে অথবা সংযোগ সময়সীমা অতিবাহিত হয়ে যায়। আপনি কাস্টম রিট্রাই লজিক যোগ করতে পারেন, যেমন অনুরোধের ব্যর্থতার পর কিছু নির্দিষ্ট সংখ্যক রিটার্ন চেষ্টা করা।
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.DefaultHttpRequestRetryHandler;
import org.apache.hc.client5.http.impl.classic.HttpRequestRetryHandler;
import org.apache.hc.core5.http.ParseException;
import java.io.IOException;
public class RetryMechanismExample {
public static void main(String[] args) throws Exception {
// Custom Retry Handler তৈরি করা (3 বার retry করবে)
HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true);
// HTTP ক্লায়েন্ট তৈরি করা, যাতে retry mechanism সেট করা হয়
try (CloseableHttpClient httpClient = HttpClients.custom()
.setRetryHandler(retryHandler) // Retry handler যোগ করা
.build()) {
// GET অনুরোধ তৈরি করা
HttpGet request = new HttpGet("https://example.com");
// HTTP অনুরোধ পাঠানো এবং পুনঃচেষ্টা করা
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println("HTTP Response Status Code: " + response.getCode());
}
}
}
}
DefaultHttpRequestRetryHandler
: এটি একটি পূর্বনির্ধারিত রিট্রাই মেকানিজম, যা HTTP অনুরোধ ব্যর্থ হলে কিছু নির্দিষ্ট সংখ্যক রিটার্ন চেষ্টা করে। উপরের উদাহরণে, এটি ৩ বার চেষ্টা করবে।setRetryHandler(retryHandler)
: এটি ক্লায়েন্টে রিট্রাই মেকানিজম সেট করার জন্য ব্যবহৃত হয়।আপনি যদি একটি কাস্টম রিট্রাই লজিক তৈরি করতে চান, তবে আপনি নিজস্ব HttpRequestRetryHandler
ইমপ্লিমেন্ট করতে পারেন, যা নির্দিষ্ট শর্তের উপর ভিত্তি করে রিটার্ন চেষ্টা করবে।
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpRequestRetryHandler;
import org.apache.hc.core5.http.ParseException;
import java.io.IOException;
import org.apache.hc.client5.http.impl.classic.DefaultHttpRequestRetryHandler;
public class CustomRetryHandlerExample {
public static void main(String[] args) throws Exception {
// Custom retry handler ইমপ্লিমেন্ট করা
HttpRequestRetryHandler customRetryHandler = (exception, executionCount, context) -> {
if (executionCount > 3) { // ৩বারের বেশি retry না করবে
return false;
}
if (exception instanceof IOException) { // শুধু IOException এ retry হবে
return true;
}
return false;
};
// HTTP ক্লায়েন্ট তৈরি করা, যাতে custom retry handler সেট করা হয়
try (CloseableHttpClient httpClient = HttpClients.custom()
.setRetryHandler(customRetryHandler) // Custom retry handler যোগ করা
.build()) {
// GET অনুরোধ তৈরি করা
HttpGet request = new HttpGet("https://example.com");
// HTTP অনুরোধ পাঠানো এবং পুনঃচেষ্টা করা
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println("HTTP Response Status Code: " + response.getCode());
}
}
}
}
IOException
এর জন্য রিট্রাই করবে এবং সর্বোচ্চ ৩ বার রিট্রাই করবে।executionCount > 3
: এটা চেক করে যে, ৩ বার রিট্রাই করার পর আরও রিটার্ন চেষ্টা না করা হয়।এই দুটি ফিচার আপনাকে ক্লায়েন্টের পারফরম্যান্স এবং স্থিতিশীলতা উন্নত করতে সাহায্য করতে পারে, বিশেষত যখন সার্ভার অস্থির থাকে অথবা সংযোগের সমস্যা হয়।
common.read_more