Request এবং Response Interception একটি গুরুত্বপূর্ণ টেকনিক্যাল কৌশল যা RESTful ওয়েব সার্ভিসে ব্যবহৃত হয়। এটি ওয়েব সার্ভিসের ইনপুট (request) এবং আউটপুট (response) প্রক্রিয়াগুলোর মধ্যে কিছু প্রক্রিয়া বা লজিক কার্যকর করতে সাহায্য করে, যেমন লগিং, অথেনটিকেশন, থ্রটলিং, ক্যাশিং, ইত্যাদি।
JAX-RS API এ, Interceptor ব্যবহার করে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়ায় হুক করতে পারেন। Interceptor ব্যবহার করা হয় আন্ডারলিং HTTP রিকোয়েস্ট এবং রেসপন্সের ওপর এক্সট্রা ফাংশনালিটি প্রয়োগ করার জন্য।
JAX-RS ইন্টারসেপ্টরগুলি মূলত Request Interceptors এবং Response Interceptors হিসেবে বিভক্ত করা হয়।
এখানে Client এবং Server-এর জন্য Request এবং Response Interceptor তৈরি করার পদ্ধতি আলোচনা করা হবে।
নিচে একটি উদাহরণ দেওয়া হলো কিভাবে একটি 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");
}
}
}
@Provider
: এটি এই ক্লাসটিকে JAX-RS ফিল্টার হিসেবে চিহ্নিত করে।ContainerRequestFilter
: এটি একটি ইন্টারফেস যা রিকোয়েস্ট ফিল্টার করার জন্য ব্যবহার করা হয়।filter()
মেথডে আপনি রিকোয়েস্টের ইউআরআই বা হেডার পরীক্ষা করতে পারেন এবং প্রয়োজন অনুযায়ী রিকোয়েস্টটি পরিবর্তন করতে পারেন বা ব্যতিক্রম (exception) ছুঁড়ে দিতে পারেন।একটি 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");
}
}
ContainerResponseFilter
: এটি একটি ইন্টারফেস যা রেসপন্স ফিল্টার করার জন্য ব্যবহৃত হয়।filter()
মেথডে আপনি রেসপন্সের স্ট্যাটাস, হেডার বা কন্টেন্ট পরিবর্তন করতে পারেন। এখানে, আমরা রেসপন্সে একটি কাস্টম হেডার যোগ করেছি।এখানে একটি ক্লায়েন্ট সাইড রিকোয়েস্ট ইন্টারসেপ্টরের উদাহরণ দেওয়া হলো:
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");
}
}
এখন ক্লায়েন্ট সাইডে রেসপন্স ইন্টারসেপ্টর কিভাবে তৈরি করা যায় তা দেখা যাক:
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);
}
}
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()
মেথডের মাধ্যমে ইন্টারসেপ্টর ক্লাসগুলো অ্যাপ্লিকেশন কনটেক্সটে রেজিস্টার করা হয়েছে।
Read more