Request এবং Response Interception

Web Development - অ্যাপাচি সিএক্সএফ (Apache CXF) - Endpoints এবং Interceptors (এন্ডপয়েন্ট এবং ইন্টারসেপ্টরস) |

Request এবং Response Interception একটি গুরুত্বপূর্ণ টেকনিক্যাল কৌশল যা RESTful ওয়েব সার্ভিসে ব্যবহৃত হয়। এটি ওয়েব সার্ভিসের ইনপুট (request) এবং আউটপুট (response) প্রক্রিয়াগুলোর মধ্যে কিছু প্রক্রিয়া বা লজিক কার্যকর করতে সাহায্য করে, যেমন লগিং, অথেনটিকেশন, থ্রটলিং, ক্যাশিং, ইত্যাদি।

JAX-RS API এ, Interceptor ব্যবহার করে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়ায় হুক করতে পারেন। Interceptor ব্যবহার করা হয় আন্ডারলিং HTTP রিকোয়েস্ট এবং রেসপন্সের ওপর এক্সট্রা ফাংশনালিটি প্রয়োগ করার জন্য।


ধাপ 1: Request এবং Response Interceptor

JAX-RS ইন্টারসেপ্টরগুলি মূলত Request Interceptors এবং Response Interceptors হিসেবে বিভক্ত করা হয়।

  • Request Interceptor: রিকোয়েস্ট গ্রহণের আগে কিছু ফাংশনালিটি (যেমন লগিং বা অথেনটিকেশন) প্রয়োগ করার জন্য ব্যবহৃত হয়।
  • Response Interceptor: রেসপন্স ক্লায়েন্টের কাছে পাঠানোর আগে কিছু ফাংশনালিটি (যেমন কাস্টম হেডার যোগ করা বা লগিং) প্রয়োগ করতে ব্যবহৃত হয়।

এখানে Client এবং Server-এর জন্য Request এবং Response Interceptor তৈরি করার পদ্ধতি আলোচনা করা হবে।


ধাপ 2: Request Interceptor তৈরি (Server-Side)

2.1 Server-Side Request Interceptor (In-Scope)

নিচে একটি উদাহরণ দেওয়া হলো কিভাবে একটি Server-Side Request Interceptor তৈরি করা যায়। এতে প্রতি রিকোয়েস্টের জন্য কিছু কাস্টম লজিক যেমন লগিং বা ডাটা প্রক্রিয়াকরণ করা হবে।

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class RequestInterceptor implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        // Log the incoming request
        System.out.println("Incoming request: " + requestContext.getUriInfo().getRequestUri());

        // You can also manipulate the request here, for example, check for authentication
        String authHeader = requestContext.getHeaderString("Authorization");
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw new IOException("Unauthorized: Missing or invalid Authorization header");
        }
    }
}

2.2 কোডের ব্যাখ্যা

  • @Provider: এটি এই ক্লাসটিকে JAX-RS ফিল্টার হিসেবে চিহ্নিত করে।
  • ContainerRequestFilter: এটি একটি ইন্টারফেস যা রিকোয়েস্ট ফিল্টার করার জন্য ব্যবহার করা হয়।
  • filter() মেথডে আপনি রিকোয়েস্টের ইউআরআই বা হেডার পরীক্ষা করতে পারেন এবং প্রয়োজন অনুযায়ী রিকোয়েস্টটি পরিবর্তন করতে পারেন বা ব্যতিক্রম (exception) ছুঁড়ে দিতে পারেন।

ধাপ 3: Response Interceptor তৈরি (Server-Side)

3.1 Server-Side Response Interceptor (In-Scope)

একটি Server-Side Response Interceptor তৈরি করা হলো, যাতে রেসপন্স ক্লায়েন্টের কাছে পাঠানোর আগে কিছু লজিক প্রয়োগ করা যায়।

import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class ResponseInterceptor implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        // Log the outgoing response status
        System.out.println("Outgoing response: " + responseContext.getStatus());

        // Modify the response before sending to the client
        responseContext.getHeaders().add("X-Custom-Header", "CustomResponseHeader");
    }
}

3.2 কোডের ব্যাখ্যা

  • ContainerResponseFilter: এটি একটি ইন্টারফেস যা রেসপন্স ফিল্টার করার জন্য ব্যবহৃত হয়।
  • filter() মেথডে আপনি রেসপন্সের স্ট্যাটাস, হেডার বা কন্টেন্ট পরিবর্তন করতে পারেন। এখানে, আমরা রেসপন্সে একটি কাস্টম হেডার যোগ করেছি।

ধাপ 4: Client-Side Request এবং Response Interceptor

4.1 Client-Side Request Interceptor

এখানে একটি ক্লায়েন্ট সাইড রিকোয়েস্ট ইন্টারসেপ্টরের উদাহরণ দেওয়া হলো:

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class ClientRequestInterceptor implements ClientRequestFilter {

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        // Log the outgoing client request URI
        System.out.println("Client Request URI: " + requestContext.getUri());
        
        // Add custom header
        requestContext.getHeaders().add("X-Custom-Request-Header", "CustomValue");
    }
}

4.2 Client-Side Response Interceptor

এখন ক্লায়েন্ট সাইডে রেসপন্স ইন্টারসেপ্টর কিভাবে তৈরি করা যায় তা দেখা যাক:

import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class ClientResponseInterceptor implements ClientResponseFilter {

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
        // Log the incoming client response status
        System.out.println("Client Response Status: " + responseContext.getStatus());

        // Modify the client response if necessary
        String responseMessage = responseContext.getEntity(String.class);
        System.out.println("Response: " + responseMessage);
    }
}

ধাপ 5: Interceptor রেজিস্ট্রেশন

Interceptor ক্লাসগুলোকে JAX-RS Application-এ রেজিস্টার করতে হবে, যাতে সেগুলো কার্যকরী হয়।

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.add(RequestInterceptor.class);
        resources.add(ResponseInterceptor.class);
        resources.add(ClientRequestInterceptor.class);
        resources.add(ClientResponseInterceptor.class);
        return resources;
    }
}

এখানে getClasses() মেথডের মাধ্যমে ইন্টারসেপ্টর ক্লাসগুলো অ্যাপ্লিকেশন কনটেক্সটে রেজিস্টার করা হয়েছে।


সারাংশ

  • Request Interceptor এবং Response Interceptor জ্যাক্স-আরএস এ HTTP রিকোয়েস্ট এবং রেসপন্সের উপর বিভিন্ন ফিল্টারিং বা প্রক্রিয়াকরণ করার সুবিধা দেয়।
  • Server-Side এবং Client-Side ইন্টারসেপ্টর দুটি আলাদা আলাদা স্তরে কাজ করে, যেখানে সার্ভার সাইড ইন্টারসেপ্টর সার্ভিসে ক্লায়েন্টের রিকোয়েস্ট গ্রহণের আগে এবং রেসপন্স পাঠানোর আগে কার্যকর হয়, এবং ক্লায়েন্ট সাইড ইন্টারসেপ্টর ক্লায়েন্ট থেকে সার্ভারে পাঠানোর আগে এবং সার্ভার থেকে ক্লায়েন্টে রেসপন্স পাওয়ার পরে কার্যকর হয়।
  • ইন্টারসেপ্টরের মাধ্যমে আমরা লগিং, অথেনটিকেশন, রিকোয়েস্ট হেডার যাচাই, রেসপন্স কাস্টমাইজেশন ইত্যাদি কার্যকরভাবে পরিচালনা করতে পারি।
Content added By
Promotion