Чи підтримують веб-служби SOAP лише метод http “POST”


74

Я зіткнувся з цим запитанням під час одного з інтерв’ю, тож не могли б ви сказати, чи підтримують веб-служби SOAP лише метод http “POST”, чи є спосіб прийняти інші методи на стороні сервера?

Відповіді:


90

Я завжди використовував POST, але відповідно до стандарту W3C , SOAP підтримує як POST, так і GET методи.

Редагувати: Після деяких досліджень здається, що це не зовсім так, як ви можете бачити тут . Це теоретично можливо використовувати GET , оскільки POST і GET є методи HTTP - протоколу SOAP транспорту і може бути використано над HTTP.

Але, як відомо, GET включає запит у рядок запиту. Запити SOAP (повідомлення XML) зазвичай занадто складні та багатослівні, щоб їх можна було включити до рядка запиту, тому майже кожна реалізація (наприклад, JAX-WS) підтримує лише POST.


20

Потоку три роки, але я думаю, що все ще знайдеться багато людей, які поставлять це саме те питання і знайдуть неправильну відповідь в Інтернеті. Відповідь на запитання - ні, також може бути використаний метод 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. Це абсолютно неправильно.


0

Це реалізація 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;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.