Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Making SOAP With Mule Runtime

DZone's Guide to

Making SOAP With Mule Runtime

Writing and consuming SOAP web services in MuleSoft ESB is as simple as writing a couple of lines as code. There are still a lot of SOAP-based web services around.

· Integration Zone ·
Free Resource

Learn more about how to Prevent Slow or Broken APIs From Affecting Your Bottom Line.

Today, we will be talking about how to use SOAP APIs with the Mulesoft ESB AnyPoint platform. SOAP-based web services have been around for a long time. With the recent advances in REST web services, most of us are moving towards REST — but there are still a lot of SOAP-based web services around. When we work in integration, sooner or later, we will come face-to-face with either writing or consuming SOAP services. Doing these two in MuleSoft ESB is as simple as a putting few lines of code and we will be done.

I will not be going into details about SOAP. Rather, I will concentrate on creating. In the next part of this blog, we will see how to consume SOAP in Mule runtime. 

Let's start by creating a simple service and then by consuming it in Mule runtime.

Publishing SOAP Services

Mule runtime uses the Apache open-source CXF framework to build SOAP APIs. We can create a CXF API in Anypoint Studio by configuring a CXF component in our Mule flow to perform any of the following CXF operations related to publishing a SOAP API:

  • Publish a simple service.
  • Publish a JAX-WS service.
  • Proxy a published service.

The CXF component will facilitate, enable WS-security, specify data bindings, and add interceptors to CXF API.

There are three main parts of exposing the SOAP API in Mule runtime using CXF.

Image title

1. Inbound Endpoint Element

It receives requests and sends responses, both containing XML SOAP envelopes. Some of the valid endpoints are HTTP, HTTPS, JMS, and VM.

2. CXF Component

SOAP web services are exposed using WSDL (web service descriptive language). WSDL is a contract between client and server. A WSDL can be accessed by adding ?wsdl to the APIs URL when performing a request.

Through CXF, you present a WSDL contract using one of the following methods:

  • WSDL-first. Start with a WSDL file that you created yourself, import it into your Mule project, then reference its location from the CXF component.
  • Code-first. Start with an annotated Java class, then have JAX-WS compile a WSDL file based on it.

The CXF component is implemented as annotations on Java classes. There is a direct relationship between the WSDL structure and the Java annotations needed. When you use a WSDL, Java POJOs are generated with the correct annotations. You can also force an existing Java POJO to adhere to a WSDL spec. The Anypoint Studio can also create flows to act as SOAP clients.

Image title

3. Other Component

This component is simply a combination of components that performs the operations on the API.

The Java Interface

Image title

The interface should be annotated with javax.jws.WebService. This is the only thing you need to do to the interface that creates the contract of your web service.

The Java Class

The next remaining thing is to implement the service class and give an implemenation to your web service.

Image title

This implementation class is where you put all the business logic of your web service. As shown in above image I have put various method with different types of input arguments.

Now let's start the project and see how the WSDL file looks and how can we access it: http://localhost:63081/hello?wsdl.

Image title

With this, we are done with creating the SOAP-based web service server. In the next blog, I will show how we can use this web service and create a client for it using Mule runtime.

Let me know what you think!

Video 

Learn about the Five Steps to API Monitoring Success with Runscope

Topics:
mulesoft ,anypoint studio ,soap ,integration ,tutorial ,api

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}