← Назад к вопросам
На каком протоколе работает 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: Протоколы
| Характеристика | SOAP | REST |
|---|---|---|
| Транспорт | HTTP/HTTPS | HTTP/HTTPS |
| Метод | POST (обычно) | GET, POST, PUT, DELETE |
| Формат | XML (SOAP envelope) | JSON, XML |
| WS- спецификации* | Да (WS-Security, WS-ReliableMessaging) | Нет |
| Асинхронность | WS-ReliableMessaging | Callbacks, 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)