简体   繁体   中英

Classic ASP post and receive XML

Hey I've been trying for hours to receive a XML via a classic ASP page but it just wont work.

Here my code:

post.asp

url = "http://myurl.com/receive.asp"
information = "<Send><UserName>Colt</UserName><PassWord>Taylor</PassWord><Data>100</Data></Send>"
Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST", url, false
xmlhttp.setRequestHeader "Content-Type", "text/xml" 
xmlhttp.send information

receive.asp

Dim objXmlRequest
Set objXmlRequest = Server.CreateObject("MSXML2.DOMDOCUMENT.3.0")
  objXmlRequest.async = False
  objXmlRequest.setProperty "ServerHTTPRequest", True
  objXmlRequest.validateOnParse = True
  objXmlRequest.preserveWhiteSpace = True

IF objXmlRequest.Load (Request) THEN
  'GET THE REQUEST FROM CLIENT
  strQuery = "//" & "ActionName"
  Set oNode = objXmlRequest.selectSingleNode(strQuery)
  strActionName = oNode.Text
  response.write("success")
ELSE
    Response.Write "Failed to load XML file, reason: " & objXmlRequest.parseError.reason 
END IF

This error appears:

Failed to load XML file, reason: XML document must have a top level element.

I just don't get it. Also i want to know if there is a posibilty to save the loaded XML?

Try this

Post.asp

<%
    information = "<Send><UserName>Colt</UserName><PassWord>Taylor</PassWord><Data>100</Data></Send>"
    Response.ContentType = "text/xml"
    Response.Write information
    Response.End
%>

Receive.asp

<%
    '// URL from which to get the XML - it has to include the full URL, I think
    Dim URL: URL = "http://localhost:8096//pages/test/post.asp"

    response.write URL & "<br/>"


    '// Request the XML from the post.asp page
    Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
    xmlhttp.Open "GET", url, false
    xmlhttp.send

    '// Get the received XML object directly from the xmlhttp object
    dim objXML: set objXML = xmlHttp.ResponseXML
    response.write typename(objXML) & "<br/>"

    '// Check that XML has been recieved
    IF not objXML is Nothing THEN

        '// Get the data from the xml
        strQuery = "//UserName"
        Set oNode = objXML.selectSingleNode(strQuery)
        strUserName = oNode.Text
        response.write "success - user = " & strUserName & "<br/>"

    ELSE

        Response.Write "Failed to load XML file"

    END IF

%>

This is the result when you open the page "receive.asp" (in my case http://localhost:8096/pages/test/receive.asp )

http://localhost:8096/pages/test/post.asp
DOMDocument
success - user = Colt

OK, here is my alternative answer, this time the page that you request sends an XML string to another page, which loads it into an XML document and extracts data from the XML.

[EDIT] The technique you have used to send XML in your original post works fine, see the final version (post3.asp /receive3.asp) shown below.

In post2.asp / receive2.asp I have encoded the XML as a form field named XML, then loaded that field into the XML object at the receiving end. This works fine for relatively small XML files.

In this example, you have to request the post2.asp page:

post2.asp

<%

    Response.write "Posting XML data to another page<br/>"

    '// URL to which to send XML data
    URL="http://localhost:8096/pages/test/receive2.asp"

    '// The XML string to be sent
    Dim Information: Information = "<Send><UserName>Colt</UserName><PassWord>Taylor</PassWord><Data>100</Data></Send>"

    dim XMLHttp : SET XMLHttp = Server.CreateObject("MSXML2.ServerXMLHttp")

    xmlhttp.Open "POST", url, false
    xmlhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 

    '// URLEncode the XML into a form data string and send it
    xmlhttp.send "xml=" & server.URLEncode( Information )

    '// Get the response that is send by receive2.asp
    dim sResponse: sResponse = xmlhttp.ResponseText

    '// Show the response
    Response.write "Response received from the called page:<hr/><span style='color:blue'>" & sResponse & "</span><hr/>"

%>

Receive2.asp

<%

    '// Get the xml string from the request
    xml = Request.form("xml")

    '// Write the received XML as a displayable html string
    response.write "[" & replace(replace(xml, "<", "&lt;"), ">", "&gt;") & "]<br/>"

    '// Create the XML object to load the string
     Dim objXml
     Set objXml = Server.CreateObject("MSXML2.DOMDOCUMENT.3.0")

     '// Try to load the xml string
    if objXML.LoadXML(xml) THEN

        '// Get the data from the xml
        strQuery = "//UserName"
        Set oNode = objXML.selectSingleNode(strQuery)
        strUserName = oNode.Text

        '// Success message
        response.write "success - user = " & strUserName & "<br/>"

    ELSE

        '// Failed message
        Response.Write "Failed to load XML file, reason: " & objXML.parseError.reason & "<br/>"

    END IF
%>

This is the result you get when opening the post2.asp page

Posting XML data to another page
Response received from the called page:
_______________________________________________________
[<Send><UserName>Colt</UserName><PassWord>Taylor</PassWord><Data>100</Data></Send>]
success - user = Colt
_______________________________________________________

Here is the final version, this time using the XML content type. You have to open the page post3.asp:

Post3.asp

<%

    '// URL to which to send XML data
    URL="http://localhost:8096/pages/test/receive3.asp"

    Response.Write "Sending XML data to " & URL & "<br/>"

    information = "<Send><UserName>Colt</UserName><PassWord>Taylor</PassWord><Data>100</Data></Send>"
    Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
    xmlhttp.Open "POST", url, false
    xmlhttp.setRequestHeader "Content-Type", "text/xml" 
    xmlhttp.send information

    '// Report the response from the called page
    response.write "Response received:<hr/><span style='color:blue'>" & xmlhttp.ResponseText & "</span><hr/>"

%>

Receive3.asp

<%

    Dim objXmlRequest
    Set objXmlRequest = Server.CreateObject("MSXML2.DOMDOCUMENT.3.0")

    IF objXmlRequest.Load (Request) THEN

      'GET THE REQUEST FROM CLIENT
      strQuery = "//UserName"
      Set oNode = objXmlRequest.selectSingleNode(strQuery)
      strActionName = oNode.Text
      response.write "success! user name is " & strActionName  

    ELSE

        Response.Write "Failed to load XML file, reason: " & objXmlRequest.parseError.reason 

    END IF
%>

and the result is:

Sending XML data to http://localhost:8096/pages/test/receive3.asp

Response received:
success! user name is Colt

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM