· Aug 1, 2018

Net.HttpRequest - blank response?


I am trying to create a script to connect to a website and extract all the content of the page. And in future to connect to an API.

Set httprequest=##class(%Net.HttpRequest).%New()
DO httprequest.Get("",2)
Write ">"_httprequest.HttpResponse 

But the output is a wonderful blank HttpResponse

Any ideas?


Discussion (13)1
Log in or sign up to continue

There are some mistakes.

#1 the links should be "HTTPS://" and you didn't set a ssl/tls config.

if you use 

Set sc=httprequest.Get("",2)
Do $system.OBJ.DisplayError(sc)

you get ERROR #6159: ===> SSL missing

#2 HttpResponse is an ObjectReferce not a Property

set res=httprequest.HttpResponse
ZW res
+----------------- general information ---------------
|      oref value: 3
|      class name: %Net.HttpResponse
| reference count: 3
+----------------- attribute values ------------------
|    ContentBoundary = ""
|        ContentInfo = ""
|      ContentLength = 178
|        ContentType = "text/html"
|               Data = "4@%Stream.GlobalCharacter"   ;;; here is your reply
|Headers("CONNECTION") = "keep-alive"
|Headers("CONTENT-LENGTH") = 178
|Headers("CONTENT-TYPE") = "text/html"
|    Headers("DATE") = "Wed, 01 Aug 2018 15:25:05 GMT"
|Headers("LOCATION") = ""
|  Headers("SERVER") = "nginx"
|  Headers("X-TYPE") = "default"
|        HttpVersion = "HTTP/1.1"
|       ReasonPhrase = "Moved Permanently"
|         StatusCode = 301
|         StatusLine = "HTTP/1.1 301 Moved Permanently"

The content is in a Stream!! 
So Write is totally inappropriate to show it. Instead:

do res.OutputToDevice()   ;;;or similar

HTTP/1.1 301 Moved Permanently
CONNECTION: keep-alive
DATE: Wed, 01 Aug 2018 15:25:05 GMT
X-TYPE: default
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>

Yo are absolutely right although I am still confused.

I copied  httprequest.Get("",2) from one example found in the documentation so I was expected to work. Also, to get data from a website don't think you have to use https or SSL right? I tried with different APIs in other applications and just passing the right URL I was able to retreive the data.

About httprequest.HttpResponse  you are right again... I was using httprequest.HttpResponse.Data and outputtodevice but I was having an error as the object did not I tried to check if the object was really created or not...

What would be the right script to connect then? I am trying to get data from this API


Thanks for your help... I think the problem I am having is not with my code but with ensemble or IT. Apparently somehow the connection to external content is blocked. I can access to the websites with no issues from web browsers but when trying to access from studio or test SSL from ensemble...error!!

Is there any security configuration to block that kind of access in ensemble?


I have tried to created an SSL/TLS configuration but not sure why is not working:

It does not matter what I try to test it...always returns the same error:

ERROR #989: SSL connection failed, make sure server address and port (not url) is specified

I tried "" 443, "" 443...nothing

Those sites I am trying to connect to....don't really need anything special to connect...just url


Thanks for the help:

1. I have tried from the server where ensemble is running. In IE, I can access but when trying from studio...nothing blank response...all from the same matchine!

2. I tried that and yes... ERROR #6059: Unable to open TCP/IP socket to server so I think you are right but I cannot believe the problem is no visibility when in IE I can access the website with no issues.

I have tried by IP, apparently

so  in IE: => ok, => ok

but using:

Set httprequest=##class(%Net.HttpRequest).%New()
Set httprequest.Server = ""
Set httprequest.Port=80
set status = httprequest.Get("/",2)
DO $system.OBJ.DisplayError(status)

ERROR #6059: Unable to open TCP/IP socket to server

I have no idea what's going on


So I checked that the web site will receive a ping, some don't for security purposes, and it seems ok:


PING ( 56 data bytes

64 bytes from icmp_seq=0 ttl=56 time=80.280 ms

64 bytes from icmp_seq=1 ttl=56 time=76.565 ms

64 bytes from icmp_seq=2 ttl=56 time=53.358 ms


PING ( 56 data bytes

64 bytes from icmp_seq=0 ttl=56 time=17.981 ms

64 bytes from icmp_seq=1 ttl=56 time=17.399 ms

64 bytes from icmp_seq=2 ttl=56 time=86.598 ms

64 bytes from icmp_seq=3 ttl=56 time=53.091 ms

64 bytes from icmp_seq=4 ttl=56 time=54.445 ms

Try opening up a terminal on the Ensemble box and PING If that works then we know that the network is ok.

Good Luck


Ok, so a couple of things to check:

1. When you say that you can connect from a browser but not from Ensemble, is the browser that you're using on the same computer as Ensemble?

2. Instead of a 'do httprequest.Get(...)' use 'set status=httprequest.Get(...)' and then inspect the value of 'status'. You can do 'do $system.OBJ.DisplayError(status)' in order to get a readable output. If the result is that you cannot open a TCP/IP socket then Ensemble cannot see the other computer. Otherwise the status should give you more information.

Are you addressing the other computer by its IP address or its DNS name? If you're using the DNS name then try using the IP address. If that works then edit your 'hosts' file to put the name and IP address in there and go back to using the DNS name to get to the other computer.

Let me know how you get on.


This will work. The second parameter of '2' indicates test mode and will write out the response to the current device

set httprequest = ##class(%Net.HttpRequest).%New()
set httprequest.Server = ""
set status = httprequest.Get("/",2)

You should see something like this:

HTTP/1.1 301 Moved Permanently
CONNECTION: keep-alive
CONTENT-TYPE: text/html
DATE: Thu, 02 Aug 2018 10:21:56 GMT
SERVER: nginx
X-TYPE: default
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>

Alternatively you can do this:

Setup an SSL/TLS Configuration. This is very simple and doesn't have any values apart from a name. Mine is called 'test'

Then use the following code:

set httprequest = ##class(%Net.HttpRequest).%New()
set httprequest.Server = ""
set httprequest.SSLConfiguration = "test"
set httprequest.Https = 1
set status = httprequest.Get("/")
if status {
     do httprequest.HttpResponse.Data.Rewind()
     do {
          write httprequest.HttpResponse.Data.Read()
     } while 'httprequest.HttpResponse.Data.AtEnd