A WSDL is an XML document that describes a web service. It actually stands for Web Services Description Language.
SOAP is an XML-based protocol that lets you exchange info over a particular protocol (can be HTTP or SMTP, for example) between applications. It stands for Simple Object Access Protocol and uses XML for its messaging format to relay the information.
REST is an architectural style of networked systems and stands for Representational State Transfer. It's not a standard itself, but does use standards such as HTTP, URL, XML, etc.
There is a maven plugin, the cxf-codegen-plugin, that will auto generate java classes from a WSDL. It will also create a stub client for you if you want to see how to use the generated code.
Edit 2019-11-15
For this example I downloaded the wsdl located here* and saved it as stockquote.wsdl.
* The wsdl is no longer available from where I initially downloaded it. Find the wsdl included in this answer further below.
$ tree
.
|-- cxf-wsdl2java-example.iml
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- stackoverflow
| | `-- App.java
| `-- resources
| `-- stockquote.wsdl
`-- test
`-- java
`-- com
`-- stackoverflow
`-- AppTest.java
10 directories, 5 files
$ cat pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>cxf-wsdl2java-example</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>cxf-wsdl2java-example</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.7.7</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/resources/stockquote.wsdl</wsdl>
<extraargs>
<extraarg>-impl</extraarg>
<extraarg>-verbose</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
$ mvn generate-sources
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building cxf-wsdl2java-example 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- cxf-codegen-plugin:2.7.7:wsdl2java (generate-sources) @ cxf-wsdl2java-example ---
Loading FrontEnd jaxws ...
Loading DataBinding jaxb ...
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.462s
[INFO] Finished at: Mon Oct 21 14:44:54 MDT 2013
[INFO] Final Memory: 11M/211M
[INFO] ------------------------------------------------------------------------
$ tree .
.
|-- cxf-wsdl2java-example.iml
|-- pom.xml
|-- src
| |-- main
| | |-- java
| | | `-- com
| | | `-- stackoverflow
| | | `-- App.java
| | `-- resources
| | `-- stockquote.wsdl
| `-- test
| `-- java
| `-- com
| `-- stackoverflow
| `-- AppTest.java
`-- target
|-- classes
|-- cxf-codegen-plugin-markers
`-- generated
`-- cxf
`-- net
`-- webservicex
|-- GetQuote.java
|-- GetQuoteResponse.java
|-- ObjectFactory.java
|-- package-info.java
|-- StockQuoteHttpGetImpl.java
|-- StockQuoteHttpGet.java
|-- StockQuoteHttpPostImpl.java
|-- StockQuoteHttpPost.java
|-- StockQuote.java
|-- StockQuoteSoapImpl1.java
|-- StockQuoteSoapImpl.java
`-- StockQuoteSoap.java
17 directories, 17 files
$ cat target/generated/cxf/net/webservicex/StockQuote.java
package net.webservicex;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.Service;
/**
* This class was generated by Apache CXF 2.7.7
* 2013-10-21T14:44:54.749-06:00
* Generated source version: 2.7.7
*
*/
@WebServiceClient(name = "StockQuote",
wsdlLocation = "file:/home/axiopisty/projects/cxf-wsdl2java-example/src/main/resources/stockquote.wsdl",
targetNamespace = "http://www.webserviceX.NET/")
public class StockQuote extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://www.webserviceX.NET/", "StockQuote");
public final static QName StockQuoteHttpPost = new QName("http://www.webserviceX.NET/", "StockQuoteHttpPost");
public final static QName StockQuoteSoap = new QName("http://www.webserviceX.NET/", "StockQuoteSoap");
public final static QName StockQuoteSoap12 = new QName("http://www.webserviceX.NET/", "StockQuoteSoap12");
public final static QName StockQuoteHttpGet = new QName("http://www.webserviceX.NET/", "StockQuoteHttpGet");
static {
URL url = null;
try {
url = new URL("file:/home/axiopisty/projects/cxf-wsdl2java-example/src/main/resources/stockquote.wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(StockQuote.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "file:/home/axiopisty/projects/cxf-wsdl2java-example/src/main/resources/stockquote.wsdl");
}
WSDL_LOCATION = url;
}
public StockQuote(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
}
public StockQuote(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public StockQuote() {
super(WSDL_LOCATION, SERVICE);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(WebServiceFeature ... features) {
super(WSDL_LOCATION, SERVICE, features);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(URL wsdlLocation, WebServiceFeature ... features) {
super(wsdlLocation, SERVICE, features);
}
//This constructor requires JAX-WS API 2.2. You will need to endorse the 2.2
//API jar or re-run wsdl2java with "-frontend jaxws21" to generate JAX-WS 2.1
//compliant code instead.
public StockQuote(URL wsdlLocation, QName serviceName, WebServiceFeature ... features) {
super(wsdlLocation, serviceName, features);
}
/**
*
* @return
* returns StockQuoteHttpPost
*/
@WebEndpoint(name = "StockQuoteHttpPost")
public StockQuoteHttpPost getStockQuoteHttpPost() {
return super.getPort(StockQuoteHttpPost, StockQuoteHttpPost.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteHttpPost
*/
@WebEndpoint(name = "StockQuoteHttpPost")
public StockQuoteHttpPost getStockQuoteHttpPost(WebServiceFeature... features) {
return super.getPort(StockQuoteHttpPost, StockQuoteHttpPost.class, features);
}
/**
*
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap")
public StockQuoteSoap getStockQuoteSoap() {
return super.getPort(StockQuoteSoap, StockQuoteSoap.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap")
public StockQuoteSoap getStockQuoteSoap(WebServiceFeature... features) {
return super.getPort(StockQuoteSoap, StockQuoteSoap.class, features);
}
/**
*
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap12")
public StockQuoteSoap getStockQuoteSoap12() {
return super.getPort(StockQuoteSoap12, StockQuoteSoap.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteSoap
*/
@WebEndpoint(name = "StockQuoteSoap12")
public StockQuoteSoap getStockQuoteSoap12(WebServiceFeature... features) {
return super.getPort(StockQuoteSoap12, StockQuoteSoap.class, features);
}
/**
*
* @return
* returns StockQuoteHttpGet
*/
@WebEndpoint(name = "StockQuoteHttpGet")
public StockQuoteHttpGet getStockQuoteHttpGet() {
return super.getPort(StockQuoteHttpGet, StockQuoteHttpGet.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns StockQuoteHttpGet
*/
@WebEndpoint(name = "StockQuoteHttpGet")
public StockQuoteHttpGet getStockQuoteHttpGet(WebServiceFeature... features) {
return super.getPort(StockQuoteHttpGet, StockQuoteHttpGet.class, features);
}
}
EDIT 9/11/2017
Here is the content of the wsdl file just in case the website serving it ever goes away.
stockquote.wsdl:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.webserviceX.NET/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.webserviceX.NET/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET/">
<s:element name="GetQuote">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetQuoteResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="string" nillable="true" type="s:string" />
</s:schema>
</wsdl:types>
<wsdl:message name="GetQuoteSoapIn">
<wsdl:part name="parameters" element="tns:GetQuote" />
</wsdl:message>
<wsdl:message name="GetQuoteSoapOut">
<wsdl:part name="parameters" element="tns:GetQuoteResponse" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpGetIn">
<wsdl:part name="symbol" type="s:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpGetOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpPostIn">
<wsdl:part name="symbol" type="s:string" />
</wsdl:message>
<wsdl:message name="GetQuoteHttpPostOut">
<wsdl:part name="Body" element="tns:string" />
</wsdl:message>
<wsdl:portType name="StockQuoteSoap">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteSoapIn" />
<wsdl:output message="tns:GetQuoteSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="StockQuoteHttpGet">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteHttpGetIn" />
<wsdl:output message="tns:GetQuoteHttpGetOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="StockQuoteHttpPost">
<wsdl:operation name="GetQuote">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get Stock quote for a company Symbol</wsdl:documentation>
<wsdl:input message="tns:GetQuoteHttpPostIn" />
<wsdl:output message="tns:GetQuoteHttpPostOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetQuote">
<soap:operation soapAction="http://www.webserviceX.NET/GetQuote" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteSoap12" type="tns:StockQuoteSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetQuote">
<soap12:operation soapAction="http://www.webserviceX.NET/GetQuote" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet">
<http:binding verb="GET" />
<wsdl:operation name="GetQuote">
<http:operation location="/GetQuote" />
<wsdl:input>
<http:urlEncoded />
</wsdl:input>
<wsdl:output>
<mime:mimeXml part="Body" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost">
<http:binding verb="POST" />
<wsdl:operation name="GetQuote">
<http:operation location="/GetQuote" />
<wsdl:input>
<mime:content type="application/x-www-form-urlencoded" />
</wsdl:input>
<wsdl:output>
<mime:mimeXml part="Body" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuote">
<wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap">
<soap:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteSoap12" binding="tns:StockQuoteSoap12">
<soap12:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet">
<http:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
<wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost">
<http:address location="http://www.webservicex.net/stockquote.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Best Answer
The statement "SOAP, as a REST" does not make any sense. REST is an architectural style. SOAP is a web services protocol that does not adhere to REST standards. A SOAP service can be invoked over HTTP.
If using SOAP over HTTP then yes you can invoke a SOAP by posting the SOAP message to the correct resource. There is a reasonable example of doing this on the SOAP wikipedia page linked to below. https://en.wikipedia.org/wiki/SOAP#Example_message
There is nothing wrong with avoiding the WSDL client generators, and building your own SOAP client. The generators are just there to do this for you to make it easier. The generated clients will handle managing the HTTP client, the deserialization/serialization logic, SOAP exception handling and translation for you. If you decide to not use them then you will have to write that logic yourself.