Thursday, March 31, 2011

How to call web service using vbscript (synchronous) ?

Actually there many examples and I have used one of them. But it works asynchronous, I mean it is not waiting the function that I called to finish.

function ProcessSend() 
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.4.0")
    Set oXMLDoc = CreateObject("MSXML2.DOMDocument")

    oXMLHTTP.onreadystatechange = getRef("HandleStateChange") 

    strEnvelope = "callNo="&callNo&"&exp="&exp

    call oXMLHTTP.open("POST","http://localhost:11883/ServiceCall.asmx/"&posFirm,true)
    call oXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded")


    call oXMLHTTP.send(strEnvelope)
end function

Sub HandleStateChange 
    if(oXMLHTTP.readyState = 4) then
     dim szResponse: szResponse = oXMLHTTP.responseText
     call oXMLDoc.loadXML(szResponse)
     if(oXMLDoc.parseError.errorCode <> 0) then
      'call msgbox("ERROR")
      response = oXMLHTTP.responseText&" "&oXMLDoc.parseError.reason
      'call msgbox(oXMLDoc.parseError.reason)
     else
      response = oXMLDoc.getElementsByTagName("string")(0).childNodes(0).text
     end if

    end if
End Sub

I call ProcessSend function in a javascript function. It connects to webservice, and returns the "response" variable. But my javascript function do not wait ProcessSend function result. How can I make it synchronous?

From stackoverflow
  • Here you go:

    function ProcessSend() 
        Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.4.0")
        Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
    
        oXMLHTTP.onreadystatechange = getRef("HandleStateChange") 
    
        strEnvelope = "callNo="&callNo&"&exp="&exp
    
        call oXMLHTTP.open("POST","http://localhost:11883/ServiceCall.asmx/"&posFirm,false)'<< changed true to false here.
        call oXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    
    
        call oXMLHTTP.send(strEnvelope)
    end function
    
    Sub HandleStateChange 
        if(oXMLHTTP.readyState = 4) then
            dim szResponse: szResponse = oXMLHTTP.responseText
            call oXMLDoc.loadXML(szResponse)
            if(oXMLDoc.parseError.errorCode <> 0) then
                    'call msgbox("ERROR")
                    response = oXMLHTTP.responseText&" "&oXMLDoc.parseError.reason
                    'call msgbox(oXMLDoc.parseError.reason)
            else
                    response = oXMLDoc.getElementsByTagName("string")(0).childNodes(0).text
            end if
    
        end if
    End Sub
    

    Why are you btw doing this in VBScript, if the rest of your code is in JScript? Like this:

    function ProcessSend(){ 
        var oXMLHTTP = ActiveXObject("MSXML2.XMLHTTP.4.0") 
        strEnvelope = "callNo=" + callNo + " & exp=" + exp;
        oXMLHTTP.open("POST", "http://localhost:11883/ServiceCall.asmx/" + posFirm, false);
        oXMLHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        oXMLHTTP.send(strEnvelope);
        if(oXMLHTTP.readyState == 4){
            if(oXMLHTTP.responseXML.parseError.errorCode != 0){
                    response = oXMLHTTP.responseText & " " & oXMLHTTP.responseXML.parseError.reason;
            }else{
                    response = oXMLHTTP.responseXML.getElementsByTagName("string")(0).childNodes(0).text;
            }
        }
    }
    
    NetSide : thanks. Why am I using vbscript? Actually I dont know, I am trying to revise the code written in vbscript.
  • If you're doing synchronous calls, you don't need the callback, and you can shrink the code into this:

    function ProcessSend() 
        Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.4.0")
        Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
    
        strEnvelope = "callNo=" & callNo & "&exp=" & exp
    
        call oXMLHTTP.open("POST", "http://localhost:11883/ServiceCall.asmx/"&posFirm, false)
        call oXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
        call oXMLHTTP.send(strEnvelope)
    
        dim szResponse: szResponse = oXMLHTTP.responseText
        call oXMLDoc.loadXML(szResponse)
    
        if(oXMLDoc.parseError.errorCode <> 0) then
            'call msgbox("ERROR")
            response = oXMLHTTP.responseText&" "&oXMLDoc.parseError.reason
            'call msgbox(oXMLDoc.parseError.reason)
        else
            response = oXMLDoc.getElementsByTagName("string")(0).childNodes(0).text
        end if
    End Sub
    

0 comments:

Post a Comment