Unterstützen SOAP-Webdienste nur die http-Methode "POST"?


74

Ich habe diese Frage in einem der Interviews gestellt. Können Sie bitte sagen, ob SOAP-Webdienste nur die http-Methode "POST" unterstützen oder ob es eine Möglichkeit gibt, andere Methoden auf der Serverseite zu akzeptieren?

Antworten:


90

Ich habe immer POST verwendet, aber gemäß dem W3C-Standard unterstützt SOAP sowohl POST- als auch GET-Methoden.

Bearbeiten: Nach einigen Recherchen scheint es, dass es nicht ganz wahr ist, wie Sie hier sehen können . Es ist theoretisch möglich, GET zu verwenden, da POST und GET Methoden des HTTP-Transportprotokolls sind und SOAP über HTTP verwendet werden kann.

Wie Sie jedoch wissen, nimmt GET die Anforderung in die Abfragezeichenfolge auf. SOAP-Anforderungen (XML-Nachrichten) sind normalerweise zu komplex und ausführlich, um in die Abfragezeichenfolge aufgenommen zu werden. Daher unterstützt fast jede Implementierung (z. B. JAX-WS) nur POST.


20

Thread ist drei Jahre alt, aber ich denke, dass es immer noch viele Leute geben wird, die sich dieselbe Frage stellen und im Web eine falsche Antwort finden. Die Antwort auf die Frage lautet Nein. Die GET-Methode kann ebenfalls verwendet werden.

Gemäß der SOAP-Spezifikation, die hier zu finden ist: https://www.w3.org/TR/2007/REC-soap12-part0-20070427/#transport können sowohl GET- als auch POST-Methoden zum Austausch von SOAP-Nachrichten über http verwendet werden. Die Verwendung der HTTP-POST-Methode zum Übermitteln von SOAP-Nachrichten in den Körpern der HTTP-Anforderung verwendet ein Muster, das als SOAP-Anforderungs-Antwort-Nachrichtenaustauschmuster bezeichnet wird . Im Fall von HTTP GET wird ein Muster verwendet, das als SOAP-Antwortnachrichtenaustauschmuster bezeichnet wird . Der Hauptunterschied dieser beiden Muster ist:

Die erste Art der Interaktion ermöglicht die Verwendung von Daten im Hauptteil eines HTTP-POST, um den Status einer Ressource zu erstellen oder zu ändern, die durch den URI identifiziert wird, für den die HTTP-Anforderung bestimmt ist. Die zweite Art von Interaktionsmuster bietet die Möglichkeit, eine HTTP-GET-Anforderung zu verwenden, um eine Darstellung einer Ressource zu erhalten, ohne ihren Status in irgendeiner Weise zu ändern. Im ersten Fall besteht der SOAP-spezifische Aspekt darin, dass der Hauptteil der HTTP-POST-Anforderung eine SOAP-Nachricht ist, die (gemäß dem SOAP-Verarbeitungsmodell) als Teil der anwendungsspezifischen Verarbeitung verarbeitet werden muss, die zur Konformität erforderlich ist die POST-Semantik. Im zweiten Fall ist die typische vorgesehene Verwendung der Fall, in dem die Darstellung der angeforderten Ressource nicht als HTML- oder generisches XML-Dokument, sondern als SOAP-Nachricht zurückgegeben wird. Das ist,

Somit können sowohl GET- als auch POST-Methoden verwendet werden. Die andere Sache ist, dass in der Praxis meistens die POST-Methode verwendet wird.

Das Schlimme ist, dass beim Vergleich von RESTful-Diensten mit SOAP-Diensten als Vorteil von REST-Benutzern Caching eingeführt wird, das in SOAP nicht verfügbar ist, da SOAP nur POST verwendet. Das ist völlig falsch.


0

Dies ist eine Implementierung von GET in 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;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.