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();
soap_request: testContent;???
ReplyDeletewhere go testContent
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:
ReplyDeletefunction 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();
}
Hello
ReplyDelete