SOAP

ধরো, তুমি একটি কোর ব্যাংকিং সিস্টেম বা বড় কোনো ফিন্যান্সিয়াল অ্যাপ্লিকেশন ডেভেলপ করছো, যেটিকে প্রতিদিন লক্ষ লক্ষ ট্রানজ্যাকশন হ্যান্ডেল করতে হয়। এ ধরনের সিস্টেমে পারফরম্যান্সের চেয়েও বেশি জরুরি হলো ডেটার শতভাগ নির্ভুলতা, নিরাপত্তা এবং নির্দিষ্ট নিয়মের কঠোর প্রয়োগ (Strict Validation)। তুমি যদি এমন একটি API আর্কিটেকচার চাও যা কোনোভাবেই ভুল ডেটা অ্যাকসেপ্ট করবে না এবং প্রতিটি রিকুয়েস্ট একটি ফর্মাল লিগ্যাল কন্ট্রাক্টের মতো কাজ করবে, তবে তুমি যে প্রযুক্তিটি খুঁজছো তা হলো SOAP (Simple Object Access Protocol)।

বর্তমান সময়ে মাইক্রোসার্ভিস আর্কিটেকচারে REST বা GraphQL অনেক জনপ্রিয় হলেও, লিগ্যাসি সিস্টেম, ব্যাংকিং, পেমেন্ট গেটওয়ে, টেলিকম এবং সরকারি বড় এন্টারপ্রাইজ সিস্টেমে SOAP এখনও অপরিহার্য। কারণ হলো এর অত্যন্ত শক্তিশালী স্ট্রাকচার, বিল্ট-ইন সিকিউরিটি এবং ডিস্ট্রিবিউটেড ট্রানজ্যাকশন হ্যান্ডেল করার নির্ভরযোগ্যতা।

সোপ (SOAP) আসলে কী?

SOAP হলো ক্লায়েন্ট এবং সার্ভারের মধ্যে স্ট্রাকচার্ড ডেটা (Structured Data) আদান-প্রদান করার জন্য একটি প্রোটোকল, যা এক্সএমএল (XML) নির্ভর। REST যেখানে একটি আর্কিটেকচারাল স্টাইল, SOAP সেখানে একটি কঠোর নিয়মবদ্ধ প্রোটোকল (Protocol)। এটি সাধারণত রিমোট প্রসিডিউর কল (RPC) মেকানিজমে কাজ করে।

SOAP-এর মূল বৈশিষ্ট্যসমূহ:

  • প্ল্যাটফর্ম ও ল্যাঙ্গুয়েজ স্বাধীন: ক্লায়েন্ট এবং সার্ভার সম্পূর্ণ ভিন্ন অপারেটিং সিস্টেম বা প্রোগ্রামিং ভাষায় লেখা হলেও একে অপরের সাথে যোগাযোগ করতে পারে।

  • প্রটোকল ইন্ডিপেনডেন্ট: REST যেখানে শুধু HTTP বা HTTPS এর উপর নির্ভরশীল, SOAP সেখানে HTTP, SMTP (ইমেইল), TCP/IP বা JMS (Java Message Service) এর ওপর দিয়েও অনায়াসে ডেটা ট্রান্সফার করতে পারে।

  • কঠোর নিয়ম ও এক্সটেন্সিবিলিটি: এটি সম্পূর্ণ XML ভিত্তিক এবং এর নিজস্ব গ্লোবাল স্ট্যান্ডার্ড রয়েছে (W3C স্ট্যান্ডার্ড)।

সোপ মেসেজ স্ট্রাকচার (SOAP Message Structure)

একটি SOAP মেসেজ মূলত একটি স্ট্যান্ডার্ড XML ডকুমেন্ট। এর প্রধান চারটি অংশ থাকে:

১. এনভেলপ (Envelope):

এটি প্রতিটি SOAP মেসেজের রুট (Root) এলিমেন্ট। এটি মেসেজের শুরু এবং শেষ নির্দেশ করে। এটি বুঝিয়ে দেয় যে পুরো XML ডকুমেন্টটি আসলে একটি SOAP মেসেজ।

২. হেডার (Header - ঐচ্ছিক):

এটি মেসেজের মেটাডেটা বহন করে। ট্রানজ্যাকশন আইডি, অথেনটিকেশন ক্রেডেনশিয়ালস (Authentication credentials), মেসেজ রাউটিং ইনফরমেশন বা সেশন ম্যানেজমেন্টের মতো জটিল ডেটা এখানে থাকে। এন্টারপ্রাইজ লেভেলে হেডারের মাধ্যমেই অনেক সিকিউরিটি প্রোটোকল ইমপ্লিমেন্ট করা হয়।

৩. বডি (Body):

এটি মেসেজের সবচেয়ে গুরুত্বপূর্ণ অংশ, যেখানে মূল পে-লোড (Payload) বা রিকুয়েস্ট/রেসপন্সের ডেটা থাকে। তুমি সার্ভারকে যে কাজ করতে বলছো (যেমন: ব্যালেন্স চেক), তার বিস্তারিত এখানেই থাকে।

৪. ফল্ট (Fault - ঐচ্ছিক):

যদি রিকুয়েস্ট প্রসেস করার সময় সার্ভারে কোনো এরর (Error) হয়, তবে বডির ভেতরে এই Fault ব্লকটি রেসপন্স হিসেবে আসে। এতে এররের বিস্তারিত কারণ, কোড এবং স্ট্যাটাস উল্লেখ থাকে।

ডাব্লিউএসডিএল (WSDL): সোপ এপিআই-এর ব্লুপ্রিন্ট

WSDL (Web Services Description Language) হলো একটি মেশিন-রিডেবল XML ডকুমেন্ট, যা পুরো SOAP API-এর একটি লিগ্যাল কন্ট্রাক্ট বা ব্লুপ্রিন্ট হিসেবে কাজ করে। ক্লায়েন্টকে API ইন্টিগ্রেট করার আগে শুধু WSDL ফাইলটি দিলেই হয়, ক্লায়েন্ট সেখান থেকে স্বয়ংক্রিয়ভাবে কোড জেনারেট (Auto-generate) করে নিতে পারে।

WSDL-এর মূল অংশগুলো:

  • Types: API-তে কী ধরনের কাস্টম ডেটা টাইপ (XML Schema) ব্যবহার করা হবে তা নির্ধারণ করে।

  • Message: রিকুয়েস্ট এবং রেসপন্স মেসেজের ডেটা স্ট্রাকচার সংজ্ঞায়িত করে।

  • PortType (বা Interface): API-তে কী কী অপারেশন বা ফাংশনালিটি (যেমন: CheckBalance) আছে তা বলে দেয়।

  • Binding: ডেটা ট্রান্সফারের জন্য কোন প্রোটোকল (যেমন HTTP) এবং ডেটা ফরম্যাট ব্যবহৃত হবে তা ঠিক করে।

ডাব্লিউএস-সিকিউরিটি এবং অন্যান্য স্ট্যান্ডার্ড (WS-*)

SOAP-এর সবচেয়ে বড় শক্তির জায়গা হলো এর গ্লোবাল স্ট্যান্ডার্ড, যা "WS-*" (Web Services) নামে পরিচিত। এগুলোর কারণে REST-এর চেয়ে SOAP অনেক বেশি সিকিউরড এবং রিলায়েবল।

  • WS-Security: এটি সাধারণ SSL/TLS-এর বাইরে গিয়ে সরাসরি XML ডেটাকে এনক্রিপ্ট (XML Encryption) করে এবং ডেটা টেম্পারিং রোধে ডিজিটাল সিগনেচার (XML Signature) ব্যবহার করে।

  • WS-ReliableMessaging: নেটওয়ার্ক কানেকশন ফেইল করলেও মেসেজটি যে অন্তত একবার ডেলিভারি হবেই, তার নিশ্চয়তা দেয়।

  • WS-AtomicTransaction: একাধিক সার্ভারে ডিস্ট্রিবিউটেড ট্রানজ্যাকশন (যেমন এক ব্যাংক থেকে টাকা কেটে অন্য ব্যাংকে জমা দেওয়া) সম্পূর্ণ না হলে তা স্বয়ংক্রিয়ভাবে রোলব্যাক (Rollback) করে ডেটার ইন্টিগ্রিটি বজায় রাখে।

সোপ বনাম রেস্ট (SOAP vs REST)

বৈশিষ্ট্য

SOAP (Simple Object Access Protocol)

REST (Representational State Transfer)

আর্কিটেকচার

এটি একটি প্রোটোকল (Protocol)।

এটি একটি আর্কিটেকচারাল স্টাইল (Style)।

ডেটা ফরম্যাট

শুধুমাত্র XML ব্যবহার করতে পারে।

JSON, XML, HTML, Plain Text ইত্যাদি সাপোর্ট করে।

ব্যান্ডউইথ ও স্পিড

XML এর পে-লোড বড় হওয়ায় এটি ভারী এবং তুলনামূলক ধীর গতির।

JSON হালকা হওয়ায় এটি অনেক ফাস্ট এবং কম ব্যান্ডউইথ নেয়।

সিকিউরিটি

নিজস্ব WS-Security আছে (অত্যন্ত শক্তিশালী)।

HTTP লেভেলের সিকিউরিটি (HTTPS, OAuth, JWT) এর উপর নির্ভরশীল।

স্টেট ম্যানেজমেন্ট

স্টেটফুল (Stateful) অপারেশন সাপোর্ট করে।

সম্পূর্ণ স্টেটলেস (Stateless)।

ক্যাশিং (Caching)

ডেটা ক্যাশ করা বেশ কঠিন।

HTTP ক্যাশিং মেকানিজম খুব সহজেই ব্যবহার করা যায়।

কখন সোপ ব্যবহার করবে?

  • যখন API-তে অ্যাডভান্সড লেভেলের এন্টারপ্রাইজ সিকিউরিটি এবং ডিস্ট্রিবিউটেড ট্রানজ্যাকশন (ACID প্রপার্টিজ) খুব কড়াকড়িভাবে মেইনটেইন করা প্রয়োজন।

  • ক্লায়েন্ট এবং প্রোভাইডারের মধ্যে একটি ফর্মাল এবং কাস্টমাইজ করা যায় না এমন কন্ট্রাক্ট (WSDL) দরকার হলে।

  • টেলিকমিউনিকেশন, লিগ্যাসি বিলিং সিস্টেম বা পেমেন্ট গেটওয়ে ইন্টিগ্রেশনের ক্ষেত্রে, যেখানে ডেটার স্ট্রাকচার একটুও এদিক-সেদিক করা যাবে না।

পাইথন এবং জাভাতে সোপ ইমপ্লিমেন্টেশন

নিচে পাইথন এবং জাভা ব্যবহার করে একটি SOAP রিকুয়েস্ট হ্যান্ডেল করার বেসিক উদাহরণ দেওয়া হলো। কোড ব্লকগুলোতে কোনো বাংলা ব্যবহার করা হয়নি।

Python Example (Consuming a SOAP API using Zeep):

from zeep import Client
from zeep.exceptions import Fault

# URL to the WSDL file of the SOAP service
wsdl_url = "http://www.dneonline.com/calculator.asmx?WSDL"

try:
    # Initialize the Zeep client with the WSDL
    client = Client(wsdl=wsdl_url)
    
    # Executing the 'Add' operation defined in the WSDL
    number_one = 105
    number_two = 250
    
    # The client automatically constructs the XML envelope and sends it
    response = client.service.Add(intA=number_one, intB=number_two)
    
    print(f"SOAP Service Response - Addition Result: {response}")

except Fault as fault:
    print(f"A SOAP Fault occurred:")
    print(f"Fault Code: {fault.code}")
    print(f"Fault String: {fault.message}")
except Exception as e:
    print(f"An unexpected network or client error occurred: {str(e)}")

Java Example (Creating a simple SOAP Endpoint using Spring Boot & JAX-WS):

import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

// Defining the namespace matching the WSDL contract
@Endpoint
public class BankAccountEndpoint {

    private static final String NAMESPACE_URI = "http://zeroslab.com/banking/balances";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "CheckBalanceRequest")
    @ResponsePayload
    public CheckBalanceResponse getBalance(@RequestPayload CheckBalanceRequest request) {
        
        CheckBalanceResponse response = new CheckBalanceResponse();
        
        // Simulating business logic and transaction check
        String accountNumber = request.getAccountNumber();
        
        if (accountNumber != null && accountNumber.length() == 9) {
            response.setBalance(3400.75);
            response.setStatus("SUCCESS");
        } else {
            response.setBalance(0.0);
            response.setStatus("INVALID_ACCOUNT");
        }
        
        return response;
    }
}

// Dummy classes representing the XML payload generated by JAXB
class CheckBalanceRequest {
    private String accountNumber;
    
    public String getAccountNumber() { return accountNumber; }
    public void setAccountNumber(String accountNumber) { this.accountNumber = accountNumber; }
}

class CheckBalanceResponse {
    private double balance;
    private String status;
    
    public double getBalance() { return balance; }
    public void setBalance(double balance) { this.balance = balance; }
    
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}

SOAP হয়তো আজকের দিনে ট্র্যাডি বা হাইপড কোনো প্রযুক্তি নয়, কিন্তু এটি অত্যন্ত বিশ্বাসযোগ্য, সিকিউরড এবং স্ট্রংলি টাইপড (Strongly Typed)। এটি এমন একজন অভিজ্ঞ ইঞ্জিনিয়ারের মতো কাজ করে, যে কোনো ধরনের শর্টকাট পছন্দ করে না। যেখানে ডেটা ভ্যালিডেশন এবং ফর্মাল এপিআই কন্ট্রাক্ট নিয়ে বিন্দুমাত্র ছাড় দেওয়ার সুযোগ নেই, সেখানে SOAP এর কোনো বিকল্প নেই।