HTTP Request পাঠানো

Java Technologies - অ্যাপাচি এইচটিটিপি ক্লায়েন্ট (Apache HTTP Client)
162
162

Apache HTTP Client হল একটি শক্তিশালী লাইব্রেরি যা Java অ্যাপ্লিকেশনগুলিতে HTTP প্রোটোকল ব্যবহার করে সার্ভারের সাথে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়। এটি আপনাকে GET, POST, PUT, DELETE সহ বিভিন্ন HTTP মেথড ব্যবহার করে অনুরোধ (request) পাঠাতে সাহায্য করে এবং সার্ভারের থেকে সাড়া (response) গ্রহণ করতে সক্ষম করে।

এই লেখায়, আমরা Apache HTTP Client ব্যবহার করে কিভাবে বিভিন্ন ধরনের HTTP request (যেমন GET, POST, PUT, DELETE) পাঠানো হয় তা দেখব।


1. GET Request পাঠানো

GET মেথড ব্যবহার করা হয় সার্ভার থেকে তথ্য রিট্রিভ (retrieve) করতে। এটি সাধারণত ডেটা পড়ার জন্য ব্যবহৃত হয় এবং এতে request body থাকে না, শুধুমাত্র URL এবং হেডার থাকে।

GET Request উদাহরণ:

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.util.EntityUtils;

public class HttpClientGetExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // HTTP GET request
            HttpGet request = new HttpGet("https://api.example.com/data");

            // Send the request and get the response
            HttpResponse response = httpClient.execute(request);

            // Get the response content as a String
            String responseBody = EntityUtils.toString(response.getEntity());

            System.out.println("Response: " + responseBody);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

এখানে:

  • HttpGet মেথডটি ব্যবহার করা হয়েছে একটি GET অনুরোধ পাঠানোর জন্য।
  • EntityUtils.toString() মেথডটি রেসপন্সের কন্টেন্টকে স্ট্রিং হিসেবে রিড করে।

2. POST Request পাঠানো

POST মেথডটি সাধারণত সার্ভারে নতুন তথ্য পাঠানোর জন্য ব্যবহৃত হয়। POST অনুরোধে request body থাকে, যাতে ক্লায়েন্ট সার্ভারে তথ্য পাঠায় (যেমন JSON, XML, অথবা form data)।

POST Request উদাহরণ:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpClientPostExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // HTTP POST request
            HttpPost post = new HttpPost("https://api.example.com/submit");

            // Set the body of the POST request
            String json = "{\"name\":\"John\", \"age\":30}";
            post.setEntity(new StringEntity(json));
            post.setHeader("Content-Type", "application/json");

            // Send the request and get the response
            HttpResponse response = httpClient.execute(post);

            // Get the response content as a String
            String responseBody = EntityUtils.toString(response.getEntity());

            System.out.println("Response: " + responseBody);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

এখানে:

  • HttpPost মেথডটি ব্যবহার করা হয়েছে একটি POST অনুরোধ পাঠানোর জন্য।
  • StringEntity ব্যবহার করে JSON ডেটা পাঠানো হয়েছে, এবং Content-Type হেডারটি application/json হিসেবে সেট করা হয়েছে।

3. PUT Request পাঠানো

PUT মেথডটি সাধারণত একটি রিসোর্স (resource) সম্পূর্ণভাবে আপডেট বা প্রতিস্থাপন করতে ব্যবহৃত হয়। PUT অনুরোধে সার্ভারে পূর্ণ বা আংশিক ডেটা পাঠানো হয়, যা প্রক্রিয়া হয়ে সার্ভারে সংরক্ষণ হয়।

PUT Request উদাহরণ:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpClientPutExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // HTTP PUT request
            HttpPut put = new HttpPut("https://api.example.com/update");

            // Set the body of the PUT request
            String json = "{\"name\":\"John\", \"age\":35}";
            put.setEntity(new StringEntity(json));
            put.setHeader("Content-Type", "application/json");

            // Send the request and get the response
            HttpResponse response = httpClient.execute(put);

            // Get the response content as a String
            String responseBody = EntityUtils.toString(response.getEntity());

            System.out.println("Response: " + responseBody);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

এখানে:

  • HttpPut মেথডটি ব্যবহার করা হয়েছে একটি PUT অনুরোধ পাঠানোর জন্য।
  • StringEntity ব্যবহার করে JSON ডেটা পাঠানো হয়েছে, এবং Content-Type হেডারটি application/json হিসেবে সেট করা হয়েছে।

4. DELETE Request পাঠানো

DELETE মেথডটি একটি নির্দিষ্ট রিসোর্স বা ডেটা মুছে ফেলতে ব্যবহৃত হয়। DELETE অনুরোধ সাধারণত ওয়েব সার্ভিস বা API এর মধ্যে ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়।

DELETE Request উদাহরণ:

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;

public class HttpClientDeleteExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // HTTP DELETE request
            HttpDelete delete = new HttpDelete("https://api.example.com/delete/123");

            // Send the request and get the response
            HttpResponse response = httpClient.execute(delete);

            // Get the response content as a String
            String responseBody = EntityUtils.toString(response.getEntity());

            System.out.println("Response: " + responseBody);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

এখানে:

  • HttpDelete মেথডটি ব্যবহার করা হয়েছে একটি DELETE অনুরোধ পাঠানোর জন্য।
  • URL এর মধ্যে "123" আইডি দিয়ে একটি রিসোর্স মুছে ফেলা হয়েছে।

HTTP Request এর Common Features

  • Request Headers: HTTP অনুরোধের সাথে অতিরিক্ত তথ্য (যেমন Authorization, Content-Type, Accept) পাঠানোর জন্য headers ব্যবহার করা হয়।
  • Request Body: POST বা PUT অনুরোধের ক্ষেত্রে ডেটা পাঠানোর জন্য body ব্যবহার করা হয়, যেমন JSON, XML, ফর্ম ডেটা ইত্যাদি।
  • Response Handling: HTTP অনুরোধের পরে সার্ভার থেকে রেসপন্স গ্রহণ করা হয়, যা সাধারণত স্ট্রিং বা JSON আকারে থাকে।

Apache HTTP Client একটি অত্যন্ত কার্যকরী লাইব্রেরি যা Java অ্যাপ্লিকেশন থেকে HTTP অনুরোধ এবং উত্তর পরিচালনা করতে সাহায্য করে। আপনি এই লাইব্রেরির মাধ্যমে GET, POST, PUT, এবং DELETE মেথডগুলি ব্যবহার করে বিভিন্ন সার্ভিসের সাথে যোগাযোগ করতে পারেন। এটি আধুনিক HTTP মেথডের মাধ্যমে ওয়েব অ্যাপ্লিকেশন এবং RESTful API এর মধ্যে ডেটা আদান প্রদান করার জন্য অত্যন্ত উপযোগী।

common.content_added_by

HttpGet ব্যবহার করে GET Request করা

142
142

Apache HTTP Client ব্যবহার করে HttpGet দিয়ে একটি HTTP GET অনুরোধ পাঠানোর জন্য নিচে একটি উদাহরণ এবং ব্যাখ্যা দেওয়া হলো।

উদাহরণ: HttpGet দিয়ে GET অনুরোধ করা

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
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.util.EntityUtils;

public class ApacheHttpGetExample {
    public static void main(String[] args) {
        // HttpClient তৈরি করুন
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // GET অনুরোধের জন্য URL দিন
        String url = "https://jsonplaceholder.typicode.com/posts/1";

        try {
            // HttpGet অবজেক্ট তৈরি করুন
            HttpGet httpGet = new HttpGet(url);

            System.out.println("Executing request: " + httpGet.getRequestLine());

            // অনুরোধ পাঠিয়ে প্রতিক্রিয়া সংগ্রহ করুন
            CloseableHttpResponse response = httpClient.execute(httpGet);

            try {
                // প্রতিক্রিয়া থেকে স্ট্যাটাস কোড পান
                int statusCode = response.getStatusLine().getStatusCode();
                System.out.println("Response Status Code: " + statusCode);

                // প্রতিক্রিয়া থেকে HttpEntity পান
                HttpEntity entity = response.getEntity();

                if (entity != null) {
                    // প্রতিক্রিয়ার কন্টেন্ট স্ট্রিং আকারে পড়ুন
                    String responseBody = EntityUtils.toString(entity);
                    System.out.println("Response Content: " + responseBody);
                }
            } finally {
                // প্রতিক্রিয়া বন্ধ করুন
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // HttpClient বন্ধ করুন
                httpClient.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

কোড ব্যাখ্যা

  1. HttpClient তৈরি করা

    CloseableHttpClient httpClient = HttpClients.createDefault();
    
    • HttpClients.createDefault() ব্যবহার করে ডিফল্ট কনফিগারেশনে একটি HTTP ক্লায়েন্ট তৈরি করা হয়েছে।
  2. HttpGet তৈরি করা

    HttpGet httpGet = new HttpGet(url);
    
    • HttpGet অবজেক্ট দিয়ে GET অনুরোধ প্রস্তুত করা হয়েছে।
    • URL সরাসরি HttpGet এর কনস্ট্রাক্টরে পাস করা হয়েছে।
  3. অনুরোধ পাঠানো এবং প্রতিক্রিয়া সংগ্রহ

    CloseableHttpResponse response = httpClient.execute(httpGet);
    
    • httpClient.execute(httpGet) ব্যবহার করে GET অনুরোধ সার্ভারে পাঠানো হয়েছে।
    • এর প্রতিক্রিয়া একটি CloseableHttpResponse অবজেক্টে সংরক্ষণ করা হয়েছে।
  4. প্রতিক্রিয়ার স্ট্যাটাস কোড এবং কন্টেন্ট পড়া
    • স্ট্যাটাস কোড পড়া:

      int statusCode = response.getStatusLine().getStatusCode();
      System.out.println("Response Status Code: " + statusCode);
      

      সার্ভার থেকে প্রাপ্ত HTTP স্ট্যাটাস কোড (200, 404 ইত্যাদি) প্রদর্শন করা হয়েছে।

    • বডি কন্টেন্ট পড়া:

      HttpEntity entity = response.getEntity();
      String responseBody = EntityUtils.toString(entity);
      

      HttpEntity থেকে প্রতিক্রিয়ার ডেটা EntityUtils.toString() এর মাধ্যমে স্ট্রিং আকারে পড়া হয়েছে।

  5. রিসোর্স মুক্ত করা
    • প্রতিক্রিয়া বন্ধ করুন:

      response.close();
      
    • HttpClient বন্ধ করুন:

      httpClient.close();
      

উপকারিতা

  • HttpGet সহজ এবং কার্যকর পদ্ধতি HTTP GET অনুরোধের জন্য।
  • প্রতিক্রিয়ার স্ট্যাটাস কোড এবং ডেটা সহজেই পড়া যায়।
  • JSON, XML বা অন্য ফর্ম্যাটে ডেটা প্রসেস করার জন্য ব্যবহার করা যেতে পারে।

নোট

  • এই উদাহরণে https://jsonplaceholder.typicode.com/posts/1 ব্যবহার করা হয়েছে, যা একটি উন্মুক্ত API।
  • প্রকৃত প্রজেক্টে API নিরাপত্তা এবং অটেনটিকেশন (যেমন টোকেন বা কুকি) ব্যবহার করার প্রয়োজন হতে পারে।
common.content_added_by

HttpPost ব্যবহার করে POST Request পাঠানো

130
130

Apache HTTP Client ব্যবহার করে HttpPost ব্যবহার করে একটি POST request পাঠানোর উদাহরণ নিচে দেওয়া হলো। এটি জাভা প্রোগ্রামিং ভাষায় লেখা।

এই উদাহরণে, আমরা একটি নির্দিষ্ট URL-এ ডেটা পাঠাব এবং সার্ভারের কাছ থেকে রেসপন্স গ্রহণ করব।


কোড উদাহরণ:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class ApacheHttpClientPostExample {
    public static void main(String[] args) {
        // HTTP ক্লায়েন্ট তৈরি
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            
            // POST Request এর URL
            String url = "https://example.com/api";

            // HttpPost অবজেক্ট তৈরি
            HttpPost postRequest = new HttpPost(url);

            // JSON বা অন্য ধরনের ডেটা পাঠানোর জন্য কন্টেন্ট সেট করা
            String json = "{ \"name\": \"John\", \"age\": 30 }";
            StringEntity entity = new StringEntity(json);
            
            // Request Content-Type সেট করা
            postRequest.setEntity(entity);
            postRequest.setHeader("Accept", "application/json");
            postRequest.setHeader("Content-Type", "application/json");

            // POST Request পাঠানো এবং Response গ্রহণ করা
            HttpResponse response = httpClient.execute(postRequest);

            // Response থেকে স্ট্যাটাস কোড এবং কন্টেন্ট নেওয়া
            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println("Response Code: " + statusCode);

            HttpEntity responseEntity = response.getEntity();
            if (responseEntity != null) {
                String responseBody = EntityUtils.toString(responseEntity);
                System.out.println("Response Body: " + responseBody);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

গুরুত্বপূর্ণ বিষয়:

  1. HttpPost ক্লাস:
    এটি POST request তৈরি ও পরিচালনার জন্য ব্যবহৃত হয়।
  2. StringEntity:
    এটি এমন ডেটা ধারণ করে যা POST বডিতে পাঠানো হবে। সাধারণত JSON বা XML ডেটা পাঠাতে ব্যবহৃত হয়।
  3. HttpClients.createDefault():
    একটি ডিফল্ট HTTP ক্লায়েন্ট তৈরি করে।
  4. Headers সেট করা:
    • Accept: সার্ভার থেকে কী ধরনের রেসপন্স প্রত্যাশা করছেন।
    • Content-Type: পাঠানো ডেটার ফরম্যাট।
  5. EntityUtils.toString():
    Response ডেটা String আকারে পড়ে।

Dependency (Maven):

Apache HTTP Client ব্যবহার করার জন্য Maven-এর pom.xml ফাইলে নিচের dependency যোগ করুন:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

আউটপুট:

যদি POST request সফল হয়, তাহলে এটি এরকম আউটপুট দিতে পারে:

Response Code: 200
Response Body: { "message": "Data received successfully" }

যদি কোনও অংশে সমস্যা হয় বা আপনাকে নির্দিষ্ট ডেটা হ্যান্ডলিং নিয়ে সাহায্য প্রয়োজন, জানাতে পারেন।

common.content_added_by

HttpPut এবং HttpDelete এর মাধ্যমে ডেটা আপডেট এবং মুছে ফেলা

141
141

Apache HTTP Client:

HttpPut এবং HttpDelete হলো HTTP প্রোটোকলের PUT এবং DELETE মেথডের সাথে সম্পর্কিত। এগুলো সাধারণত RESTful API ব্যবহারের সময় ডেটা আপডেট এবং মুছে ফেলার জন্য ব্যবহৃত হয়। নিচে এই দুটি মেথড ব্যবহার করার পদ্ধতি বর্ণনা করা হলো:


1. HttpPut দিয়ে ডেটা আপডেট

PUT রিকোয়েস্ট সাধারণত সার্ভারে ডেটা আপডেট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, কোনো REST API-তে একটি নির্দিষ্ট রিসোর্স আপডেট করতে চাইলে HttpPut ব্যবহার করা হয়।

উদাহরণ:

import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.HttpResponse;

public class HttpPutExample {
    public static void main(String[] args) {
        String url = "https://api.example.com/resource/123"; // যেখানে আপডেট হবে
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPut httpPut = new HttpPut(url);
            httpPut.setHeader("Content-Type", "application/json");

            // ডেটা সেট করা (JSON format)
            String json = "{\"name\":\"Updated Name\", \"age\":30}";
            StringEntity entity = new StringEntity(json);
            httpPut.setEntity(entity);

            // রিকোয়েস্ট পাঠানো
            HttpResponse response = httpClient.execute(httpPut);
            System.out.println("Response Status: " + response.getStatusLine().getStatusCode());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • HttpPut দিয়ে নির্দিষ্ট URL-এ রিকোয়েস্ট পাঠানো হয়।
  • StringEntity দিয়ে JSON ডেটা যোগ করা হয়।
  • রেসপন্স স্ট্যাটাস কোড সফল হলে 200 বা 204 হতে পারে।

2. HttpDelete দিয়ে ডেটা মুছে ফেলা

DELETE রিকোয়েস্ট ব্যবহার করে REST API-র নির্দিষ্ট রিসোর্স মুছে ফেলা যায়।

উদাহরণ:

import org.apache.http.client.methods.HttpDelete;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.HttpResponse;

public class HttpDeleteExample {
    public static void main(String[] args) {
        String url = "https://api.example.com/resource/123"; // যেখানে ডেটা মুছে ফেলবে
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpDelete httpDelete = new HttpDelete(url);

            // রিকোয়েস্ট পাঠানো
            HttpResponse response = httpClient.execute(httpDelete);
            System.out.println("Response Status: " + response.getStatusLine().getStatusCode());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • HttpDelete ব্যবহার করে নির্দিষ্ট রিসোর্স মুছে ফেলা যায়।
  • সাধারণত সফল হলে স্ট্যাটাস কোড 200, 202, বা 204 হয়।

PUT এবং DELETE এর সাথে Header এবং Authentication যোগ করা

  • Header: API-তে Authorization, Content-Type ইত্যাদি হেডার প্রয়োজন হতে পারে।
  • Authentication: টোকেন বা অন্য ধরনের অথেন্টিকেশন হেডার যোগ করতে পারেন।
httpPut.setHeader("Authorization", "Bearer your_token_here");
httpDelete.setHeader("Authorization", "Bearer your_token_here");

  • HttpPut ডেটা আপডেটের জন্য এবং HttpDelete ডেটা মুছে ফেলার জন্য অত্যন্ত কার্যকর।
  • এগুলো RESTful API ব্যবহারে ডেটা ম্যানেজমেন্টের গুরুত্বপূর্ণ অংশ।
  • প্রোডাকশনে ব্যবহার করার আগে ভুল ডেটা অপারেশন থেকে বাঁচতে সাবধানে টেস্ট করুন।
common.content_added_by

URIBuilder ব্যবহার করে URL কাস্টমাইজ করা

155
155

অ্যাপাচি এইচটিটিপি ক্লায়েন্ট (Apache HTTP Client)-এর মাধ্যমে URIBuilder ব্যবহার করে URL কাস্টমাইজ করা একটি সাধারণ কাজ। URIBuilder একটি ক্লাস যা URL তৈরি ও মডিফাই করার জন্য সহায়ক। এটি সহজে URI এর বিভিন্ন অংশ (যেমন scheme, host, path, query parameters) সেট এবং পরিবর্তন করতে দেয়।

নিচে একটি উদাহরণ দেওয়া হলো যেখানে URIBuilder ব্যবহার করে URL কাস্টমাইজ করা হয়েছে:

উদাহরণ:

import org.apache.http.client.utils.URIBuilder;

import java.net.URI;
import java.net.URISyntaxException;

public class URICustomizationExample {
    public static void main(String[] args) {
        try {
            // URIBuilder ইনস্ট্যান্স তৈরি
            URIBuilder uriBuilder = new URIBuilder();

            // Scheme (http/https) সেট করা
            uriBuilder.setScheme("https");

            // Host (ডোমেইন) সেট করা
            uriBuilder.setHost("example.com");

            // Path (URI পথ) সেট করা
            uriBuilder.setPath("/api/v1/resource");

            // Query Parameters যোগ করা
            uriBuilder.addParameter("key1", "value1");
            uriBuilder.addParameter("key2", "value2");

            // URI তৈরি
            URI uri = uriBuilder.build();

            // ফলাফল প্রিন্ট করা
            System.out.println("Customized URI: " + uri.toString());
        } catch (URISyntaxException e) {
            // যদি URI ভুল ফরম্যাটে হয়, ত্রুটি পরিচালনা
            System.err.println("Error building URI: " + e.getMessage());
        }
    }
}

আউটপুট:

Customized URI: https://example.com/api/v1/resource?key1=value1&key2=value2

গুরুত্বপূর্ণ পয়েন্ট:

  1. setScheme: URL এর scheme নির্ধারণ করে (যেমন HTTP বা HTTPS)।
  2. setHost: হোস্ট বা ডোমেইন যোগ করে (যেমন example.com)।
  3. setPath: URI এর পাথ নির্ধারণ করে।
  4. addParameter: কুইরি প্যারামিটার যোগ করতে ব্যবহৃত হয়।
  5. build: সম্পূর্ণ URI তৈরি করে।

ব্যবহার ক্ষেত্র:

  • API কলের জন্য ডাইনামিক URL তৈরি।
  • ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে URL কাস্টমাইজেশন।
  • কুইরি প্যারামিটার ও ফিল্টার যোগ করা।

এটি জাভা-ভিত্তিক অ্যাপ্লিকেশন ডেভেলপমেন্টে প্রচলিত এবং অত্যন্ত কার্যকর।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion