How do I Access Response Header in Http Request - asp-classic

I'm making a call to an external API. The data it returns, annoyingly, is in the header (the text response is empty).
How do I access the header of the response?
This is what I'm trying:
Dim httpRequest, postResponse
Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP")
httpRequest.Open "POST", "http://www.api.com", False, "un", "pw"
httpRequest.SetRequestHeader "Content-Type", "application/json"
httpRequest.setRequestHeader "Content-Length", len(jsondata)
httpRequest.Send data
if httpRequest.status = 200 then
response.write httpRequest.getResponseHeader
response.write httpRequest.ResponseText
end if
Set httpRequest = nothing
But it gives me:
msxml3.dll error '80072f76'
The requested header was not found
And a bonus question: I just noticed the "XML" part of "MSXML2.ServerXMLHTTP" - am I using the right protocol? It's always worked for straight posts and gets until now.

You need to specify the name of the response header you want to retrieve:
response.write httpRequest.getResponseHeader("SomeHeaderName")
There's no just one response header. There could be many. You have the standard response headers such as Content-Type and you could also have custom headers.
And a bonus question: I just noticed the "XML" part of
"MSXML2.ServerXMLHTTP" - am I using the right protocol?
Yes, absolutely, that's the correct COM object to be used from a classic ASP application to send HTTP requests.

Related

VBScript unable to write http.ResponseBody to ADODB Stream

I am sending an HTTP POST to an API with a json request to download a zip file. The response contains the zip file in the responseBody. I have verified this sequence in Postman with the responsebody containing the zip file.
I am attempting to save the zip file from the http response body to a local file doing the following in VBScript:
Sub Download_Study_Bundle
URL = myURL
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0"
objHTTP.setRequestHeader "Authorization", "Basic base64encodeduserandpassword"
objHTTP.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
objHTTP.setRequestHeader "CharSet", "charset=UTF-8"
objHTTP.setRequestHeader "Accept", "application/json"
json = myjson
objHTTP.send (json)
dim bStrm: Set bStrm = createobject("Adodb.Stream")
with bStrm
.type = 1 '//binary
.open
.write objHTTP.responseBody
.savetofile myFile, 2 '//overwrite
end with
end sub
I get an error on line : ".write objHTTP.responseBody"
that states:
"Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."
I can see in my logs that I get a proper 200 response with something in ResponseBody. I am unable to figure out why the responseBody cannot be written as a binary stream to the ADODB object. Any help is appreciated.
EDIT: a screenshot of the same json sent in postman produces the raw zip file in the response body:
http response

WinHttp.WinHttpRequest: The server returned an invalid or unrecognized response

In Lotus a lotusscript agent is using this piece of code from a ScriptLibrary:
Set objDom = CreateObject("MSXML2.DOMDocument")
Set objXmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Call objXmlHttp.SetTimeouts("240000", "240000", "240000", "240000")
objXmlHttp.Option(9) = 2048
objXmlHttp.Option(6) = True
objDom.async = False
objDom.LoadXml XmlBody
objXmlHttp.open "POST", Url, False
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
objXmlHttp.setRequestHeader "Content-Length", Len(XmlBody)
Status = objXmlHttp.status
responseText = objXmlHttp.responseText
The code is sending a POST. POST is from HTTPS to HTTPS URL.
When executing this post in the beginning I sometimes received a timeout, so in turn I upped the Timeouts until I am not receiving any timeouts anymore. But now I am sometimes receiving this error:
WinHttp.WinHttpRequest: The server returned an invalid or unrecognized response
When I resend the POST request then it works again. Is there any way to stop this errors?
Before the winHTTP type I always used the MSXML2.XMLHTTP object, but because TLS <1.2 will be depreceted for us, I switched to the winHTTP but this sometimes gives problems.

Twitter API bearer token request returns forbidden

Simple pull of search tweets needed an I'm getting stuck trying to obtain a bearer token via a classic ASP post.
The server is responding with 403 Unable to verify your credentials
I'm obviously fluid on ASP server side form post so any suggestions would be appreciated. Thanks.
Dim consumerKey,consumerSecret,myCstr
consumerKey = "abc..."
consumerSecret = "123..."
myCstr = base64_encode(consumerKey & ":" & consumerSecret)
myAuth = "Basic "&myCstr
Dim xmlhttp
Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
xmlhttp.Open "POST","https://api.twitter.com/oauth2/token",false
xmlhttp.setRequestHeader "User-Agent","HTTP/1.1"
xmlhttp.setRequestHeader "Authorization", myAuth
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"
xmlhttp.send "grant_type=client_credentials"
I resolved it... I needed two equal signs at the end of the end of the base64 string.
That wasn't really very clear in the twitter API docs.

Pingdom REST API from Classic ASP

I would like to use the Pingdom REST API from Classic ASP, but the following code:-
' setup the URL
baseUrl = "https://api.pingdom.com/api/2.0/checks"
' setup the request and authorization
Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
http.open "GET", baseUrl, False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.setRequestHeader "userpwd", "aaaaaaaaaaaaaaaaaaaaaaa:bbbbbbbbbbb"
http.setRequestHeader "App-Key", "ccccccccccccccccccccccccccccccc"
' send the HTTP data
http.send
gives me the error:-
{"error":{"statuscode":401,"statusdesc":"Unauthorized","errormessage":"User credentials missing"}}
so my authentication isnt being passed correctly, and it looks like it should NOT be passed in the requestheader, but I'm not sure how it should be done.
Thanks
Thanks for Alex K. and for the benefit of others, the correct syntax is:-
' setup the URL
baseUrl = "https://api.pingdom.com/api/2.0/checks"
Response.Write fullUrl
' setup the request and authorization
Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
http.open "GET", baseUrl, False, "emailaddress", "password"
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.setRequestHeader "App-Key", "keykeykeykeykeykeykeykeykeykey"
' send the HTTP data
http.send
:-)
https://api.pingdom.com/api/2.0/checks is using Basic Authentication so you need to pass your credentials in the .open call.

Encoding "<" and ">" while sending XML via HTTP Post

I am sending an XML content via HTTP Post from Access VBA to Web Methods, using XMLHTTP object in MSXML. Here is the Code.
Dim objXmlHttp As Object
Set objXmlHttp = CreateObject("MSXML2.ServerXMLHTTP")
objXmlHttp.Open "POST", webServicePath, False
objXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
Dim Response As String
objXmlHttp.send wrt.output
'OK status
If objXmlHttp.Status = 200 Then
Response = objXmlHttp.responseText
End If
Set objXmlHttp = Nothing
I am getting the XML with "&lt" and "&gt" instead of < and >.
If I try to do URL encoding, everything is received as ASCII text in the Recipient side.
Can you please guide what I need to do to get the valid XML format.
You need to set the content-type correctly, try this instead:
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=""utf-8"""

Resources