How can I extract an XML payload from SOAP message with Java? - java

I am new to SOAP and need to extract an XML payload from a SOAP message. Our application is contacting a soap service, and the service is returning an XML Document that is embedded within a SOAP message. I need to extract this XML that is within the SOAP body, and save it as a "stand alone" well formed XML document. What is the best way to go about this?

Related

how to capture soap fault detail in camel-spring-ws

I am using camel framework 2.22.0 and camel-spring-ws in my spring boot microservice to convert xml into soap at runtime and make a request to backend and same time receive the soap response and coverts it back to XML before sending the response back to calling system.
Success scenarios are all working fine but when soap fault it only logs the soap string and can't see any soap response been populated. soap response is not getting captured and doesn't get back to calling system apart from http status code 500.
The below is what backend system is sending as soap fault. I can't see anything in camel exchange body populated with soap fault. I need to capture the xml response in detail tag section and to send back to calling system.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>abc-complex-type.x.x: Value '0' of attribute 'schemaVersion' of element 'ABCSubmission:ABCSubmission' is not valid with respect to the corresponding attribute use. Attribute 'schemaVersion' has a fixed value of '1'.</faultstring>
<detail>
<ns2:ABCSubmissionException xmlns:ns2="java:com.webservice.ejb" xmlns="ABCintegration.xdt">
<ns2:ABCIntegrationError schemaVersionMajor="1" schemaVersionMinor="0">
<ErrorName>ABCMessageSyntaxInvalid</ErrorName>
<ErrorDescription>cvc-complex-type.3.1: Value '0' of attribute 'schemaVersion' of element 'ABCSubmission:ABCSubmission' is not valid with respect to the corresponding attribute use. Attribute 'schemaVersion' has a fixed value of '1'.</ErrorDescription>
</ns2:ABCIntegrationError>
</ns2:ABCSubmissionException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Camel differentiates between Exceptions and Faults (historic reasons). Unfortunately this seems to be missing in the Camel Documentation.
If you want that Camel treats Faults the same as Exceptions (handled by the Camel error handler), you have to set
.handleFault()
You can set this globally on the Camel Context or on specific routes. See also the comment at the bottom of this page

my soap server module does not receive Client form

I have developed a soap server but now i had one problem , problem in SOAP ENV and SOAP BODY. My client request form is without soapenv and soapbody
only have a values.
after executing my module export message is
'Unable to create envelope from given source because the root element
is not named Envelope'
but client form could not change.
client form
<?xml version="1.0" encoding="UTF-8"?>
<ns1:inputSOATest xmlns:ns1="http://javainuse.com">
<ns1:requestSet>
<ns2:userInfo xmlns:ns2="http://schemas.datacontract.org/2018/08/SscntBigdata.userInfo">
<ns2:EMPID></ns2:EMPID>
<ns2:SINGLEID/>
<ns2:EPID/>
<ns2:NAME></ns2:NAME>
<ns2:ENGNAME></ns2:ENGNAME>
<ns2:EMPTYPE>PAA</ns2:EMPTYPE>
<ns2:LVABSENCE/>
<ns2:RETIRE/>
<ns2:EMAIL/>
<ns2:TELNUM/>
<ns2:MBPHONE/>
<ns2:BSCADDR></ns2:BSCADDR>
<ns2:ZZBUKRS>J604</ns2:ZZBUKRS>
<ns2:DEPTNM>
<ns2:DEPTNM> China RMD BPL Part</ns2:DEPTNM>
<ns2:SPRAS>1</ns2:SPRAS>
</ns2:DEPTNM>
<ns2:DEPTNM>
<ns2:DEPTNM> BPL Part</ns2:DEPTNM>
<ns2:SPRAS>3</ns2:SPRAS>
</ns2:DEPTNM>
<ns2:PDEPTNM>
<ns2:PDEPTNM></ns2:PDEPTNM>
<ns2:SPRAS>3</ns2:SPRAS>
</ns2:PDEPTNM>
<ns2:PDEPTNM>
<ns2:PDEPTNM></ns2:PDEPTNM>
<ns2:SPRAS>E</ns2:SPRAS>
</ns2:PDEPTNM>
<ns2:CORPNM>
<ns2:CORPNM>ion Trading</ns2:CORPNM>
<ns2:SPRAS>E</ns2:SPRAS>
</ns2:CORPNM>
<ns2:CORPNM>
<ns2:CORPNM>Trading</ns2:CORPNM>
<ns2:SPRAS>3</ns2:SPRAS>
</ns2:CORPNM>
<ns2:JOBNM>
<ns2:JOBNM></ns2:JOBNM>
<ns2:SPRAS>3</ns2:SPRAS>
</ns2:JOBNM>
<ns2:JOBGRDNM>
<ns2:JOBGRDNM>()</ns2:JOBGRDNM>
<ns2:SPRAS>3</ns2:SPRAS>
</ns2:JOBGRDNM>
<ns2:JOBGRDNM>
<ns2:JOBGRDNM></ns2:JOBGRDNM>
<ns2:SPRAS>1</ns2:SPRAS>
</ns2:JOBGRDNM>
</ns2:userInfo>
</ns1:requestSet></ns1:inputSOATest>
how do i can that?
SOAP msgs are always in SOAP-ENV, SOAP-HEADER and SOAP-BODY format.
I can see your request has inputSOATest tag. If I am understanding currectly. Client data is from SOA. I thnk you have to convert SOA test to proper SOAP msg before sending to server.

Sending XML in Query String

I am integrating USPS Web API in my Java application. I have to send a request of the form
http://production.shippingapis.com/ShippingAPI.dll?API=CityStateLookup&XML=<CityStateLookupRequest%20USERID="XXXNORTH3110"> <ZipCode ID= "0"> <Zip5>22102</Zip5> </ZipCode> </CityStateLookupRequest>
Now hitting this on the browser works fine. But using this from the JAVA code breaks. How can I send XML in the Query String?
Why you should use POST to send this type of data: http://www.w3schools.com/tags/ref_httpmethods.asp
In the POST body you don't need to encode the XML, you just need to set the correct content type "application/xml". Of course that only applies if it is valid XML and does not contain char are not allowed by XML standard.

SOAP to XML conversion and sending it in response object

I am new to webservices,some how i managed to host a service with metro.With the help of SOAP UI and also httpUrlConnection object i am able to get SOAP response.But my next task is to send a response with content type "application/xml".So i used httpServletResponse,but i am not getting how to extract only XML part(without SOAP envolope and SOAP header) and also how to send XML inside respose object.Whether the way in which i am doing is rite?If yes,how to proceed with next step.
There are various ways to send xml content within SOAP response. To keep wsdl and xsd simple, you may use CDATA for your xml content and parse like a string on the receiving end.
<![CDATA[YOUR XML GOES HERE]]>
If you want to parse SOAP message and extract XML then you may want to use Java API SAAJ

Handling different XML response documents with one SAX Handler

I am developing a Java application that makes an HTTP Request to a web service, and XML is returned. If the response code is 200, then a requestSucceeded() callback method will send the XML to a SAXParser with a different SAX Handler, depending on what web service is being called. If the response code is not 200, then a requestFailed() callback method is being called.
The web service that I am calling will return two types of XML documents (with a response code of 200): an XML document containing the successful response information, or an XML error document containing error information (for example, if one of the request parameters wasn't formatted correctly).
My question is this: Given my current setup, what is the best way to look for / handle both kinds of XML documents (a successful XML response or an XML error document)? The SAX Handler is looking for all of the relevant response information and it is storing that information into an object, which is then processed by my application. Is there a better solution than just always first looking for the unique XML Error tags?
Thanks!
Option #1 - Change Respose Code
Why are you returning an error with response code 200? 400 (Bad Request) or another error code might be a better option. Then you could process the XML based on the response code.
Option #2 - Swap Content Handlers
Below is a link to one of my previous answers where I explain how to swap content handlers while processing the document. You could have one content handler that determines if the response is content or error, and then swaps in the appropriate content handler to process the rest.
Using SAX to parse common XML elements
Option #3 - Use JAXB
If the end result is that the XML will be converted to an object, have you considered using JAXB? It will build an object based on the XML based on what is returned.

Categories