Я зіткнувся з цим запитанням під час одного з інтерв’ю, тож не могли б ви сказати, чи підтримують веб-служби SOAP лише метод http “POST”, чи є спосіб прийняти інші методи на стороні сервера?
Відповіді:
Я завжди використовував POST, але відповідно до стандарту W3C , SOAP підтримує як POST, так і GET методи.
Редагувати: Після деяких досліджень здається, що це не зовсім так, як ви можете бачити тут . Це теоретично можливо використовувати GET , оскільки POST і GET є методи HTTP - протоколу SOAP транспорту і може бути використано над HTTP.
Але, як відомо, GET включає запит у рядок запиту. Запити SOAP (повідомлення XML) зазвичай занадто складні та багатослівні, щоб їх можна було включити до рядка запиту, тому майже кожна реалізація (наприклад, JAX-WS) підтримує лише POST.
Потоку три роки, але я думаю, що все ще знайдеться багато людей, які поставлять це саме те питання і знайдуть неправильну відповідь в Інтернеті. Відповідь на запитання - ні, також може бути використаний метод GET.
Відповідно до специфікації SOAP, яку можна знайти тут: https://www.w3.org/TR/2007/REC-soap12-part0-20070427/#transport, для обміну повідомленнями SOAP через http можна використовувати як методи GET, так і POST. Використання методу HTTP POST для передачі повідомлень SOAP в тілах запиту HTTP використовує шаблон, який називається шаблоном обміну повідомленнями запит-відповідь SOAP . У випадку HTTP GET використовується шаблон, який називається SOAP шаблон обміну повідомленнями відповіді . Основною відмінністю цих двох моделей є:
Перший тип взаємодії дозволяє використовувати дані всередині тіла HTTP POST для створення або модифікації стану ресурсу, визначеного URI, якому призначений HTTP-запит. Другий тип шаблону взаємодії пропонує можливість використовувати HTTP-запит GET для отримання подання ресурсу без будь-якого зміни його стану. У першому випадку специфічний для SOAP аспект викликає занепокоєння тим, що тіло запиту HTTP POST - це повідомлення SOAP, яке має бути оброблено (відповідно до моделі обробки SOAP) як частина спеціальної обробки, необхідної для відповідності семантику POST. У другому випадку, типовим використанням, яке передбачено, є випадок, коли подання запитуваного ресурсу повертається не як HTML або взагалі загальний документ XML, а як повідомлення SOAP. Це,
Тож можна використовувати як методи GET, так і POST. Інша справа, що на практиці в основному використовується метод POST.
Погана річ у тому, що при порівнянні RESTful-сервісів із SOAP-послугами, як перевага REST, люди приносять кешування, яке недоступне в SOAP, оскільки SOAP використовує лише POST. Це абсолютно неправильно.
Це реалізація GET у SOAP:
@WebServiceProvider(targetNamespace="http://attachment.service.soap.com/download")
@ServiceMode(value = javax.xml.ws.Service.Mode.MESSAGE)
@BindingType(value = HTTPBinding.HTTP_BINDING)
public final class ImageDownloadServiceProvider implements Provider<DataSource> {
@Resource
private WebServiceContext wsContext;
@Override
public DataSource invoke(DataSource request) {
if (wsContext == null)
throw new RuntimeException("dependency injection failed on wsContext");
MessageContext msgContext = wsContext.getMessageContext();
HttpExchange exchange = (HttpExchange) msgContext.get("com.sun.xml.internal.ws.http.exchange");
String filename = exchange.getRequestURI().getQuery().replace("file=", "");
switch ((String) msgContext.get(MessageContext.HTTP_REQUEST_METHOD)) {
case "GET":
return doGet(filename);
default:
throw new HTTPException(405);
}
}
private DataSource doGet(String filename) {
FileDataSource fds = new FileDataSource(filename);
MimetypesFileTypeMap mtftm = new MimetypesFileTypeMap();
mtftm.addMimeTypes("image/jpeg jpg");
fds.setFileTypeMap(mtftm);
return fds;
}