import javax.xml.soap.*; import java.util.Iterator; import java.net.URL; import java.io.*; public class Client { public static void main(String[] args) { try { SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = soapConnectionFactory.createConnection(); SOAPFactory soapFactory = SOAPFactory.newInstance(); SOAPMessage message = prepareMessage(); URL endpoint = new URL("https://opendap.co-ops.nos.noaa.gov/axis/services/HarmonicConstituents"); SOAPMessage response = connection.call(message, endpoint); connection.close(); System.out.print("\nPrinting the message that is being sent: \n\n"); message.writeTo(System.out); System.out.println("\n\n"); /* System.out.println("\nPrinting the respone that was recieved: \n\n" ); response.writeTo(System.out); */ //Uncoment this part if you want the response to be saved locally in an XML file /* FileOutputStream fout = new FileOutputStream ("SoapResponse.xml"); response.writeTo(fout); fout.close(); */ //You can also store the response as a String /* ByteArrayOutputStream out = new ByteArrayOutputStream(); response.writeTo( out ); String str = out.toString(); */ System.out.println("\n\nIterating through the response object to get the values:\n\n"); SOAPBody responseBody = response.getSOAPBody(); //Checking for errors if (responseBody.hasFault()) { SOAPFault fault = responseBody.getFault(); String actor = fault.getFaultActor(); System.out.println("Fault contains: "); System.out.println("Fault code: " + fault.getFaultCodeAsName().getQualifiedName()); System.out.println("Fault string: " + fault.getFaultString()); if (actor != null) { System.out.println("Actor: " + actor); } } else { Iterator iterator = responseBody.getChildElements(); Iterator iterator2 = null; Iterator iterator3 = null; String tagName = null; SOAPElement se = null; if (iterator.hasNext()) { se = (SOAPElement) iterator.next(); iterator = se.getChildElements(); while (iterator.hasNext()) { se = (SOAPElement) iterator.next(); printMetadata(se); tagName = se.getElementName().getLocalName(); if ("data".equals(tagName)) { iterator2 = se.getChildElements(); while (iterator2.hasNext()) { se = (SOAPElement) iterator2.next(); iterator3 = se.getChildElements(); while (iterator3.hasNext()) { se = (SOAPElement) iterator3.next(); printData(se); } } } } } } } catch (SOAPException e) { System.err.println("ERROR: ******* " + e.toString()); } catch (IOException io) { System.err.println("ERROR: ******* " + io.toString()); } } public static SOAPMessage prepareMessage() { SOAPMessage message = null; try { SOAPFactory soapFactory = SOAPFactory.newInstance(); MessageFactory factory = MessageFactory.newInstance(); message = factory.createMessage(); SOAPHeader header = message.getSOAPHeader(); SOAPBody body = message.getSOAPBody(); header.detachNode(); message.getMimeHeaders().addHeader("SOAPAction", ""); Name bodyName = soapFactory.createName("getHConstituentsAndMetadata", "HC", "https://opendap.co-ops.nos.noaa.gov/axis/webservices/harmonicconstituents/wsdl"); SOAPBodyElement bodyElement = body.addBodyElement(bodyName); ///Constructing the body for the request Name name = soapFactory.createName("stationId"); SOAPElement symbol = bodyElement.addChildElement(name); symbol.addTextNode("8454000"); name = soapFactory.createName("unit"); symbol = bodyElement.addChildElement(name); symbol.addTextNode("0"); name = soapFactory.createName("timeZone"); symbol = bodyElement.addChildElement(name); symbol.addTextNode("0"); } catch (SOAPException e) { System.err.println("ERROR: ******* " + e.toString()); } return message; } public static void printMetadata(SOAPElement se) { String tagName = se.getElementName().getLocalName(); if (tagName != null) { if ("stationId".equals(tagName)) { System.out.println("Printing Metadata \n"); System.out.println("Station ID : " + se.getValue()); } else if ("stationName".equals(tagName)) { System.out.println("station Name : " + se.getValue()); } else if ("latitude".equals(tagName)) { System.out.println("Latitude : " + se.getValue()); } else if ("longitude".equals(tagName)) { System.out.println("Longitude : " + se.getValue()); } else if ("state".equals(tagName)) { System.out.println("State : " + se.getValue()); } else if ("dataSource".equals(tagName)) { System.out.println("Data Source : " + se.getValue()); } else if ("COOPSDisclaimer".equals(tagName)) { System.out.println("COOPS Disclaimer : " + se.getValue()); } else if ("unit".equals(tagName)) { System.out.println("Unit : " + se.getValue()); } else if ("timeZone".equals(tagName)) { System.out.println("Time Zone : " + se.getValue() + "\n"); System.out.println("Printing the data \n"); } } } public static void printData(SOAPElement se) { String tagName = se.getElementName().getLocalName(); if (tagName != null) { if (tagName.equals("constNum")) { System.out.println("Constituent # : " + se.getValue()); } else if (tagName.equals("name")) { System.out.println("Name : " + se.getValue()); } else if (tagName.equals("amplitude")) { System.out.println("Amplitude : " + se.getValue()); } else if (tagName.equals("speed")) { System.out.println("Speed : " + se.getValue() + "\n"); } } } } /**************************************************** SAMPLE RUN >java Client Printing the message that is being sent: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <HC:getHConstituentsAndMetadata xmlns:HC="https://opendap.co-ops.nos.noaa.gov/axis/webservices/harmonicconstituents/wsdl"> <stationId>8454000</stationId> <unit>0</unit> <timeZone>0</timeZone> </HC:getHConstituentsAndMetadata> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Iterating through the response object to get the values: Printing Metadata Station ID : 8454000 station Name : Providence Latitude : 41.8071 Longitude : -71.4012 State : RI Data Source : USDOC/NOAA/NOS/COOPS(Center for Operational Oceanographic Products and Services) Time Zone : GMT Unit : Amplitudes are in Meters, Phases are in degrees, referenced to GMT, and Speed in degrees per hour Printing the data Constituent # : 1 Name : M2 Amplitude : 0.643 Speed : 28.9841042 Constituent # : 2 Name : S2 Amplitude : 0.138 Speed : 30.0 Constituent # : 3 Name : N2 Amplitude : 0.152 Speed : 28.4397295 Constituent # : 4 Name : K1 Amplitude : 0.073 Speed : 15.0410686 Constituent # : 5 Name : M4 Amplitude : 0.103 Speed : 57.9682084 Constituent # : 6 Name : O1 Amplitude : 0.056 Speed : 13.9430356 Constituent # : 7 Name : M6 Amplitude : 0.027 Speed : 86.9523127 Constituent # : 8 Name : MK3 Amplitude : 0.016 Speed : 44.0251729 Constituent # : 9 Name : S4 Amplitude : 0.014 Speed : 60.0 Constituent # : 10 Name : MN4 Amplitude : 0.044 Speed : 57.4238337 Constituent # : 11 Name : NU2 Amplitude : 0.027 Speed : 28.5125831 Constituent # : 12 Name : S6 Amplitude : 0.0 Speed : 90.0 Constituent # : 13 Name : MU2 Amplitude : 0.031 Speed : 27.9682084 Constituent # : 14 Name : 2N2 Amplitude : 0.022 Speed : 27.8953548 Constituent # : 15 Name : OO1 Amplitude : 0.0020 Speed : 16.1391017 Constituent # : 16 Name : LAM2 Amplitude : 0.0050 Speed : 29.4556253 Constituent # : 17 Name : S1 Amplitude : 0.016 Speed : 15.0 Constituent # : 18 Name : M1 Amplitude : 0.0050 Speed : 14.4966939 Constituent # : 19 Name : J1 Amplitude : 0.0060 Speed : 15.5854433 Constituent # : 20 Name : MM Amplitude : 0.0 Speed : 0.5443747 Constituent # : 21 Name : SSA Amplitude : 0.0 Speed : 0.0821373 Constituent # : 22 Name : SA Amplitude : 0.06 Speed : 0.0410686 Constituent # : 23 Name : MSF Amplitude : 0.0 Speed : 1.0158958 Constituent # : 24 Name : MF Amplitude : 0.0 Speed : 1.0980331 Constituent # : 25 Name : RHO Amplitude : 0.0020 Speed : 13.4715145 Constituent # : 26 Name : Q1 Amplitude : 0.016 Speed : 13.3986609 Constituent # : 27 Name : T2 Amplitude : 0.013 Speed : 29.9589333 Constituent # : 28 Name : R2 Amplitude : 0.0040 Speed : 30.0410667 Constituent # : 29 Name : 2Q1 Amplitude : 0.0010 Speed : 12.8542862 Constituent # : 30 Name : P1 Amplitude : 0.025 Speed : 14.9589314 Constituent # : 31 Name : 2SM2 Amplitude : 0.0 Speed : 31.0158958 Constituent # : 32 Name : M3 Amplitude : 0.012 Speed : 43.4761563 Constituent # : 33 Name : L2 Amplitude : 0.012 Speed : 29.5284789 Constituent # : 34 Name : 2MK3 Amplitude : 0.012 Speed : 42.9271398 Constituent # : 35 Name : K2 Amplitude : 0.038 Speed : 30.0821373 Constituent # : 36 Name : M8 Amplitude : 0.0050 Speed : 115.9364166 Constituent # : 37 Name : MS4 Amplitude : 0.026 Speed : 58.9841042 ************************************************************/