← Назад к вопросам

На каком протоколе работает SOAP

1.2 Junior🔥 111 комментариев
#REST API и микросервисы#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ на вопрос о протоколе SOAP

На каком протоколе работает SOAP?

SOAP (Simple Object Access Protocol) работает на HTTP (или HTTPS). Это основной и наиболее распространённый транспортный протокол для SOAP.

Основные характеристики

SOAP - это XML-based протокол для обмена структурированной информацией в распределённых системах. Он не зависит от транспортного слоя, но почти всегда использует HTTP/HTTPS.

HTTP как транспортный протокол

SOAP отправляет XML-сообщения через HTTP методы:

// Пример SOAP запроса через HTTP POST
POST /services/OrderService HTTP/1.1
Host: api.example.com
Content-Type: text/xml; charset=UTF-8
SOAPAction: "http://example.com/GetOrder"
Content-Length: 250

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetOrder xmlns="http://example.com/orders">
      <OrderId>12345</OrderId>
    </GetOrder>
  </soap:Body>
</soap:Envelope>

Структура SOAP сообщения

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:ord="http://example.com/orders">
  <!-- Заголовки (опциональные) -->
  <soap:Header>
    <ord:Authentication>
      <Token>abc123</Token>
    </ord:Authentication>
  </soap:Header>
  
  <!-- Тело сообщения (обязательное) -->
  <soap:Body>
    <ord:GetOrderDetails>
      <ord:OrderId>999</ord:OrderId>
    </ord:GetOrderDetails>
  </soap:Body>
  
  <!-- Fault для ошибок -->
  <soap:Fault>
    <faultcode>soap:Server</faultcode>
    <faultstring>Order not found</faultstring>
  </soap:Fault>
</soap:Envelope>

Использование в Java (JAX-WS)

// Создание SOAP клиента
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceRef;
import javax.xml.namespace.QName;

public class OrderServiceClient {
    @WebServiceRef(wsdlLocation = "http://api.example.com/OrderService?wsdl")
    private OrderService orderService;
    
    public Order getOrder(Long orderId) {
        // Клиент автоматически сериализует в SOAP
        return orderService.getOrderDetails(orderId);
    }
}

// WSDL определение
@WebService(name = "OrderService", targetNamespace = "http://example.com/orders")
public interface OrderService {
    @WebMethod
    Order getOrderDetails(@WebParam(name = "orderId") Long orderId);
}

// Реализация
@WebService(serviceName = "OrderService", endpointInterface = "com.example.OrderService")
public class OrderServiceImpl implements OrderService {
    @Override
    public Order getOrderDetails(Long orderId) {
        // Сервер автоматически отправит SOAP ответ
        return new Order(orderId, "Received");
    }
}

Методы HTTP, используемые SOAP

POST - стандартный метод

POST /services/MyService HTTP/1.1
Content-Type: text/xml
SOAPAction: "GetOrder"

<soap:Envelope>...</soap:Envelope>

GET - редко используется (обычно для получения WSDL)

GET /services/MyService?wsdl HTTP/1.1

Другие возможные протоколы (редко)

Хотя HTTP/HTTPS - стандарт, SOAP теоретически может работать на:

- SMTP (для асинхронного обмена сообщениями)
- FTP (исторически, не используется)
- JMS (Java Message Service)
- Custom TCP/IP протоколы

НО на практике используется только HTTP/HTTPS.

HTTPS для безопасности

// SOAP клиент через HTTPS
URL wsdlURL = new URL("https://secure-api.example.com/OrderService?wsdl");
QName serviceName = new QName("http://example.com/orders", "OrderService");
Service service = Service.create(wsdlURL, serviceName);
OrderService port = service.getPort(OrderService.class);

// SSL/TLS шифрование автоматически
Order order = port.getOrderDetails(123L);

REST vs SOAP: Протоколы

ХарактеристикаSOAPREST
ТранспортHTTP/HTTPSHTTP/HTTPS
МетодPOST (обычно)GET, POST, PUT, DELETE
ФорматXML (SOAP envelope)JSON, XML
WS- спецификации*Да (WS-Security, WS-ReliableMessaging)Нет
АсинхронностьWS-ReliableMessagingCallbacks, webhooks

Полный пример: SOAP сервис с Spring

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

@Endpoint
public class OrderEndpoint {
    
    @PayloadRoot(
        namespace = "http://example.com/orders",
        localPart = "GetOrderRequest"
    )
    @ResponsePayload
    public GetOrderResponse getOrder(@RequestPayload GetOrderRequest request) {
        Order order = orderService.findById(request.getOrderId());
        
        GetOrderResponse response = new GetOrderResponse();
        response.setOrder(order);
        return response;
    }
}

// Spring WS конфигурация
@Configuration
@EnableWs
public class WebServiceConfig extends WsConfigurerAdapter {
    @Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(
            ApplicationContext context) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(context);
        return new ServletRegistrationBean<>(servlet, "/ws/*");
    }
}

HTTP заголовки в SOAP

Request:
- POST /soap/service HTTP/1.1
- Host: api.example.com
- Content-Type: text/xml; charset=UTF-8
- SOAPAction: "http://example.com/GetOrder"
- Content-Length: 250
- Authorization: Basic (если требуется)

Response:
- HTTP/1.1 200 OK
- Content-Type: text/xml; charset=UTF-8
- Content-Length: 300

WSDL (Web Service Description Language)

Описание SOAP сервиса:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" 
             targetNamespace="http://example.com/orders">
  
  <!-- Описание сообщений -->
  <message name="GetOrderRequest">
    <part name="orderId" type="xsd:long"/>
  </message>
  
  <message name="GetOrderResponse">
    <part name="order" type="xsd:string"/>
  </message>
  
  <!-- Определение портового типа (интерфейса) -->
  <portType name="OrderServicePortType">
    <operation name="getOrder">
      <input message="tns:GetOrderRequest"/>
      <output message="tns:GetOrderResponse"/>
    </operation>
  </portType>
  
  <!-- Привязка к SOAP поверх HTTP -->
  <binding name="OrderServiceBinding" type="tns:OrderServicePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    
    <operation name="getOrder">
      <soap:operation soapAction="getOrder"/>
      <input><soap:body use="literal"/></input>
      <output><soap:body use="literal"/></output>
    </operation>
  </binding>
  
  <!-- Сервис (конечная точка) -->
  <service name="OrderService">
    <port name="OrderServicePort" binding="tns:OrderServiceBinding">
      <soap:address location="http://api.example.com/soap/service"/>
    </port>
  </service>
</definitions>

Асинхронное взаимодействие

// SOAP с WS-ReliableMessaging
// (обеспечивает гарантированную доставку)
@WebService
public class AsyncOrderService {
    @WebMethod(operationName = "processOrder")
    @Oneway  // Асинхронный вызов
    public void processOrder(@WebParam Order order) {
        // Обработка в фоне
        orderProcessor.process(order);
    }
}

Резюме

  • SOAP работает на HTTP/HTTPS - это стандартный транспорт
  • Формат: XML в SOAP envelope
  • Методы HTTP: обычно POST для запросов, GET для WSDL
  • WS- спецификации*: безопасность, надёжность, транзакции
  • WSDL: описание интерфейса сервиса
  • JAX-WS (Java): стандартный API для SOAP в Java
  • REST часто вытесняет SOAP в новых проектах из-за простоты
  • SOAP остаётся: в enterprise системах, банках, телекоме (legacy and complex scenarios)