Soap request from JavaFX

I was searching on net to know how to send soap request from JavaFX. I could not get a straight answer. While looking at the JavaFX 1.0 API, I did find java.io.http.HttpRequest class to send HTTP asynchronous requests. The document says that you can invoke RESTful weservices through the class.

Since HTTPRequest supports POST as a method for sending the request, I though of sending the SOAP message over HTTP. I wrote a simple utility class to facilitate the same and it did help me achieve my goal. The example is a simple class keping in mind that usually soap request are known through WSDL but we do mistakes while preparing a complete XML soap message.

I would like to share some of the points for anyone trying the same.

1. Create a simple SoapRequest class as follows:
public class SoapRequest extends HttpRequest{

2. Define the variables to create xml tags, Soap envelop and body tags
// xml header 
var XML_HEADER:String = ""; 
// namespace for SOAP 1.1 message, this is also the default namespace 
public-read var SOAP1_1:String = "http://schemas.xmlsoap.org/soap/envelope/"; 
// namespace for SOAP 1.2 message 
public-read var SOAP1_2:String = "http://www.w3.org/2003/05/soap-envelope/";
// variable to set the namespace 
public var SOAP_SPEC:String = SOAP1_1; 
var SOAP_ENVELOP_START:String = " "; 
var SOAP_ENVELOP_END:String = ""; 
var SOAP_BODY_START:String = ""; 
var SOAP_BODY_END:String = "";
public var soap_request:String;
     var soap_request_size =  soap_request.getBytes().length;

3. Override the enqueue method to set content type
override function enqueue(): Integer {
         if (not (SOAP_SPEC == SOAP1_1 or SOAP_SPEC == SOAP1_2)){
             println("Soap specification should either be SOAP1_1 or SOAP1_2");
             return 0;
         }
         setHeader("Content-Type", "text/xml");
         setHeader("Content-Length", "{soap_request_size}");
         return super.enqueue();
     }

4. Create a methode to return complete soap message to be passed as part of outputstream
public function getSoapMessage():String{ 
return "{XML_HEADER}{SOAP_ENVELOP_START}{SOAP_BODY_START}{soap_request}{SOAP_BODY_END}{SOAP_ENVELOP_END}"; }

5. Create a client to send the request in JavaFX scripting

def postRequest: SoapRequest = SoapRequest {

     location: "http://localhost:8080/JITService/";

      soap_request: testContent;

onOutput: function(os: java.io.OutputStream) {
         try {
             println("onOutput - about to write {postRequest.getSoapMessage()} to output stream");
             println("onOutput - about to write {postRequest.getSoapMessage().getBytes()} bytes to output stream");
             os.write(postRequest.getSoapMessage().getBytes());

         } finally {
             println("onOutput - about to close output stream.");
             os.close();
         }
     }

onToRead: function(bytes: Integer) {
         if (bytes <>
             println("onToRead - Content length not specified by server; bytes: {bytes}");
         } else {
             println("onToRead - total number of content bytes to read: {bytes}");
         }
     }
    };
postRequest.enqueue();
    




Comments

  1. soap_request: testContent;???
    where go testContent

    ReplyDelete
  2. if you want just to send informations using SOAP you can use also the HttpRequest.GET method , here is a real time example that works for me:
    function send(id, name, surename, ticket, credit): Void
    {
    var location1 = "http://student.labs.ii.edu.mk/ii11618/BMT/1/service_user.asmx/buy?id={id}&name={name}&surename={surename}&_tickets={ticket}&credit_card={credit}";
    var httpRequest: HttpRequest = HttpRequest
    {
    location: location1;
    method: HttpRequest.GET;
    onStarted: function (): Void
    {
    println("onStarted - started performing method: {httpRequest.method} on location: {httpRequest.location}");
    }
    onDone: function() {
    println("done")
    }
    }
    httpRequest.start();
    }

    ReplyDelete

Post a Comment

Popular posts from this blog

Hibernate: a different object with the same identifier value was already associated with the session

BeanDefinitionStoreException: Failed to parse configuration class: Could not find class [javax.jms.ConnectionFactory]