i'm searching for a methode to generate a WSDL(WSDL2) webservice descriptor for my RESTfull webservice in php.
i know that RESTfull webservice doesn't need a description like SOAP, but i need the WSDL for REST WS to add a semantic annotation for the webservice.
You can use tinyWSDL for this.
take a look here to start with.
If you use XML Schema you can either add DOM Element or use tinyXMLSchema plugin (+ Apache XML Schema 2.1 libaray).
Types types = description.getTypes();
SchemaTypesExtensions extensions = (SchemaTypesExtensions)types.getComponentExtensions(WSDLPredefinedExtension.SCHEMA.URI);
Schema schema = extensions.newSchema();
// here you can either create a new Schema
XmlSchema xmlSchema = (XmlSchema)schema.getSchema();
// or set already parsed one:
schema.setSchema(xmlSchema)
In case you don't want to bother with Apache XML Shcema library you can always use DOM Element:
types.addExtensionElement(new QName("http://www.w3.org/2001/XMLSchema", "schema", "xs"), element)
Cheers,
D.
P.S. there is also WSDL 2.0 -> WADL converter in the sourcecode (not in the jar).
Related
I am creating SOAP web service using Spring Boot SOAP Webservice Sample project. If I use following code dynamically generated WSDL shows Operations.
#PayloadRoot(namespace = NAMESPACE_URI, localPart = "AvailNotifRequest")
#ResponsePayload
public OTAHotelAvailNotifRS getAvailNotif(#RequestPayload AvailNotifRequest request) {
But I need request element to change like this.
#PayloadRoot(namespace = NAMESPACE_URI, localPart = "OTAHotelAvailNotifRQ")
#ResponsePayload
public OTAHotelAvailNotifRS getOTAHotelAvailNotifRQ(#RequestPayload OTAHotelAvailNotifRQ request) {
I found a similar question on this link Spring web service dynamic wsdl not generating message for a schema element answer says we need to add suffix Request after request element like AvailNotifRequest but I want to use OTAHotelAvailNotifRQ as my request input.
How can I use this because I am not getting operations in wsdl when I change request input like this.
According to official Spring-WS documentation:
The <dynamic-wsdl> builds a WSDL from a XSD schema by using conventions. It iterates over all element elements found in the schema, and creates a message for all elements. Next, it creates WSDL operation for all messages that end with the defined request or response suffix. The default request suffix is Request; the default response suffix is Response, though these can be changed by setting the requestSuffix and responseSuffix attributes on <dynamic-wsdl />, respectively.
In other words you can use the setRequestSuffix and setResponseSuffix on DefaultWsdl11Definition in order to specify a request and response suffix different from the default one. In the above case that could for example be:
wsdl11Definition.setRequestSuffix("RQ");
wsdl11Definition.setResponseSuffix("RS");
I need complete two Task; At the first,read CSV file by VFS Transport,convert to JSON, then Call Rest API insert to DB in the end;But I feel puzzled,How to Mapping Data Format
This blog post has somewhat similar usecase with some example configurations. (you'll need to modify/extend it to support json and call the rest service)
I am working on already written soap webservice.Now i have to introduce one more parameter in request and provide more details in response.I am using Rsa 8.
My WSDL contains two wrappers Request and Response and included a xsd file in which input and output parameters are defined.What i want to know is that do i need to do manual changes in WSDL and then in corresponding Request and Response java files or there is an auto generated way available.
I want to know the best way to do these type of changes.
you need to do the manual changes in the wsdl for adding request/response parameters and you can use wsimport to generate the codes from the updated wsdl.
So I'm having a couple of ANT scripts using Groovy to process complex calculations normal ANT can't do (at least afaik). I'm trying to access an Axis2 web service using a SOAP-envelope via Groovy. The request and response is pretty simple, except for two complexType attributes (one in the request, one in the response).
The first thing I've stumbled across was Groovy Soap. It is quite easy to use, you simply instantiate a SoapClient and call the web service method. Unfortunately it cannot handle complexType attributes in the request, which I need:
Current Limitations:
....
4: Custom data types cannot be processed on client side when using the Groovy SOAP module with the current groovy-1.0 release.
Then I've read a lot about GroovyWS. I created my Grape config file in my user.home, javac and $GROOVY_HOME are available (basically did everything as described on the project quick guide page). Grape somehow retrieved Ivy, when I first started the script (I have no experience with Grape, but I suspect it's very similar to Maven).
Then started my simple script:
#Grab(group='org.codehaus.groovy.modules', module='groovyws',version='0.5.2')
import groovyx.net.ws.WSClient
proxy = new WSClient("http://127.0.0.1/axis2/services/ReleaseService?wsdl", this.class.classLoader)
proxy.initialize()
Unfortunately I couldn't even initialize the web client (without the Groovy Soap library in the classpath):
SEVERE: Could not compile java files for http://127.0.0.1/axis2/services/ReleaseService?wsdl.
Caught: java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "com.intershop.qa.tae.ws.xsd" doesnt contain ObjectFactory.class or jaxb.index java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated [...]
With the Groovy Soap library (which seems to overload some of GroovyWS' functionality) in the classpath I've got:
Caught: java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; java.lang.NoSuchMethodError:
which looks very similar to the error I've got when I was using Groovy Soap in the first place.
So my question is: How can I communicate with an Axis2 web service using complexType parameters via ANT. I'm not limited to Groovy only, but for deployment reasons (~50 VM snapshots) I want something simple. A Java client worked, but since the deployment is quite some effort (especially if I want to change stuff in the future) I need something which is closer to ANT and easier to deploy.
Thanks in advance for suggestions of other technologies or fix ideas for my GroovyWS implementation.
I finally came up with a solution: groovy-wslight actually solved my problem and was finally able to deploy easily and access the web service without problems/exceptions.
The script:
#Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='0.7.1')
import wslite.soap.*
def client = new SOAPClient("http://127.0.0.1/axis2/services/ReleaseService")
def response = client.send {
body {
myFunction(xmlns:"http://my.namespace.com") {
stringParameter("6.3.0.0")
status() { value("default") }
mode() { value("full") }
}
}
}
Where status and mode are complexTypes which consist of one "value" attribute (as an example).
println(response.myFunctionResponse.return)
gives me the object returned by the web service. Of course the names of the tokens depend on the WSDL. In my case the response of the request is called myFunctionResponse, which has a field name="return" and gives me a complexType object. The fields of the object can be retrieved according to the names given in the WSDL:
println(response.myFunctionResponse.return.location) // gives me the field value of the field "location" for my complexType
I had a similar problem when using JDK 1.7. Switching to JDK 1.6 solved it for me.
Apparently, Groovy easily consumes web services. Can it consume a web service that needs JAX-RPC instead of JAX-WS? Should I use an older version of Groovy or its libraries to do so?
It's really easy to consume XML-RPC web services. You need the Groovy XML-RPC as well as the Smack library in your classpath.
I wrote some groovy scripts to work with our Atlassian Confluence wiki and here's a short example to retrieve a wiki page using XML-RPC:
import groovy.net.xmlrpc.*
def c = new XMLRPCServerProxy("http://host:port/rpc/xmlrpc")
def token = c.confluence1.login("username","password")
def page = c.confluence1.getPage(token, "SPACE", "pagename")
println page.content
c.confluence1.logout(token);
You use the XMLRPCServerProxy to access the XML-RPC services. If your services require complex parameters as parameters or return one, these are represented as Groovy maps, with the attribute name as key and it's value as the corresponding value. In the script above, the service getPage returns a Page object, which is a map, but as you can directly access a map's key using the dot-notation in Groovy, page.content is the same as page.get("content").
What do you mean by "can it consume a web service that needs JAX-RPC instead of JAX-WS"? What differences do you expect on the Groovy side? Did you try to call that web service as documented:
import groovyx.net.ws.WSClient
def proxy = new WSClient("http://localhost:6980/MathService?wsdl", this.class.classLoader)
proxy.initialize() // from 0.5.0
def result = proxy.add(1.0 as double, 2.0 as double)
assert (result == 3.0)
result = proxy.square(3.0 as double)
assert (result == 9.0)
Do you get any particular error?
Since Groovy can work with compiled Java classes, sometimes the easiest way to access a SOAP-based web service is to just generate the stubs and write a Groovy client that uses them. Use your "wsimport" tool (JAX-WS) or wsdl2java (JAX-RPC) to generate the stubs, and write your Groovy class as usual.