Subscribing to streaming input with ZnClient
Hello, I am wanting to subscribe to a perpetual stream of JSON data in my app. I have failed to find an example which helps me understand how to do so. It may be there but I have not discovered it. How do I do something like that? A curl example from the website. curl \ -H "Authorization: abcdefg?????" \ "https://stream-mystreamingsite.com/stream?query=whatIwant" *Response Headers* HTTP/1.1 200 OK Access-Control-Allow-Headers: Authorization, Content-Type, Accept-Datetime-Format Access-Control-Allow-Methods: PUT, PATCH, POST, GET, OPTIONS, DELETE Access-Control-Allow-Origin: * Content-Type: application/octet-stream After subscribing to the stream I will need to get and access the JSON data so that my app can process it. Any help and wisdom greatly appreciated. Thanks. Jimmie
Hi Kimmy,
On 27 Dec 2018, at 15:15, Jimmie Houchin <jlhouchin@gmail.com> wrote:
Hello,
I am wanting to subscribe to a perpetual stream of JSON data in my app. I have failed to find an example which helps me understand how to do so. It may be there but I have not discovered it.
How do I do something like that? A curl example from the website.
curl \ -H "Authorization: abcdefg?????" \
"https://stream-mystreamingsite.com/stream?query=whatIwant" Response Headers HTTP/1.1 200 OK Access-Control-Allow-Headers: Authorization, Content-Type, Accept-Datetime-Format Access-Control-Allow-Methods: PUT, PATCH, POST, GET, OPTIONS, DELETE Access-Control-Allow-Origin: * Content-Type: application/octet-stream
After subscribing to the stream I will need to get and access the JSON data so that my app can process it.
Any help and wisdom greatly appreciated.
Thanks.
Jimmie
The client and server part of the WebSockets extension to Zinc HTTP Components already supports similar functionality, so this is certainly doable. Unless you can give me a public end point to test, I can only write some untested pseudo code. | client reader | client := ZnClient new. client url: 'https://stream-mystreamingsite.com/stream?query=whatIwant'. client streaming: true. client headerAt: 'Authorization' put: 'xxx'. client get. reader := NeoJSONReader on: (ZnCharacterReadStream on: client contents). [ reader atEnd] whileFalse: [ reader next ]. reader close. client close. Be sure to tell us how you got it working. HTH, Sven
On 12/27/18 9:00 AM, Sven Van Caekenberghe wrote:
Hi Jimmie,
On 27 Dec 2018, at 15:15, Jimmie Houchin <jlhouchin@gmail.com> wrote:
Hello,
I am wanting to subscribe to a perpetual stream of JSON data in my app. I have failed to find an example which helps me understand how to do so. It may be there but I have not discovered it.
How do I do something like that? A curl example from the website.
curl \ -H "Authorization: abcdefg?????" \
"https://stream-mystreamingsite.com/stream?query=whatIwant" Response Headers HTTP/1.1 200 OK Access-Control-Allow-Headers: Authorization, Content-Type, Accept-Datetime-Format Access-Control-Allow-Methods: PUT, PATCH, POST, GET, OPTIONS, DELETE Access-Control-Allow-Origin: * Content-Type: application/octet-stream
After subscribing to the stream I will need to get and access the JSON data so that my app can process it.
Any help and wisdom greatly appreciated.
Thanks.
Jimmie The client and server part of the WebSockets extension to Zinc HTTP Components already supports similar functionality, so this is certainly doable.
Unless you can give me a public end point to test, I can only write some untested pseudo code.
| client reader | client := ZnClient new. client url: 'https://stream-mystreamingsite.com/stream?query=whatIwant'. client streaming: true. client headerAt: 'Authorization' put: 'xxx'. client get. reader := NeoJSONReader on: (ZnCharacterReadStream on: client contents). [ reader atEnd] whileFalse: [ reader next ]. reader close. client close.
Be sure to tell us how you got it working.
HTH,
Sven
Hello Sven, Thanks for your help. The server I am connecting to requires an account to access. But you provided sufficient information to get me going. Thanks. This is for a Trading Application. I am a ways off before ready for releasing. I will open source when it is usable and cleaned up enough from personal code. Currently I have named it SmallTrader, hence the ST prefix for classes. I have an STClient class which subclasses ZnClient and sets it up with the necessary account authorization. Below is the STPriceStream#mainLoop method. Basically it is populating some OrderedCollections in the STPriceStream which are available to the app's mainLoop. It is working perfectly. I currently have it printing out data to stdout so that I can watch the data it collects to visually understand what is happening. The connection below is the instance of the class which connects to this specific broker. Since connections are specific to a broker I am putting all of the parsing into ST objects such as STPrice and STCandle in the broker specific class as it understands what the broker returns. This will allow my app to be able to use different brokers simply by changing which connection class we call. Currently I am writing for one specific one where my account is located. But I want to be able to add brokers in time. Thanks again for your help. mainLoop    | delay pricesStream reader |    delay := (Duration milliSeconds: 100) asDelay.    minuteDateTime := STCandle datetimeMinute: (DateAndTime now asUTC).    pricesStream := connection newPriceStreamConnectionForInstruments: instruments.    pricesStream get.    reader := STONReader on: (ZnCharacterReadStream on: pricesStream contents).    [ reader atEnd] whileFalse: [       stop          ifFalse: [ | price |             price := connection pricesStreamNextPrice: (reader next).             price ifNotNil: [                prices add: price.                price datetimeMinute = minuteDateTime                   ifTrue: [ minutePrices add: price ]                   ifFalse: [ self processMinutePrices: price ]]]          ifTrue: [             reader close             ^ self ].       delay wait ]. Jimmie
Very nice, and thank you for the feedback.
On 28 Dec 2018, at 23:16, Jimmie Houchin <jlhouchin@gmail.com> wrote:
On 12/27/18 9:00 AM, Sven Van Caekenberghe wrote:
Hi Jimmie,
On 27 Dec 2018, at 15:15, Jimmie Houchin <jlhouchin@gmail.com> wrote:
Hello,
I am wanting to subscribe to a perpetual stream of JSON data in my app. I have failed to find an example which helps me understand how to do so. It may be there but I have not discovered it.
How do I do something like that? A curl example from the website.
curl \ -H "Authorization: abcdefg?????" \ "https://stream-mystreamingsite.com/stream?query=whatIwant" Response Headers HTTP/1.1 200 OK Access-Control-Allow-Headers: Authorization, Content-Type, Accept-Datetime-Format Access-Control-Allow-Methods: PUT, PATCH, POST, GET, OPTIONS, DELETE Access-Control-Allow-Origin: * Content-Type: application/octet-stream
After subscribing to the stream I will need to get and access the JSON data so that my app can process it.
Any help and wisdom greatly appreciated.
Thanks.
Jimmie The client and server part of the WebSockets extension to Zinc HTTP Components already supports similar functionality, so this is certainly doable.
Unless you can give me a public end point to test, I can only write some untested pseudo code.
| client reader | client := ZnClient new. client url: 'https://stream-mystreamingsite.com/stream?query=whatIwant'. client streaming: true. client headerAt: 'Authorization' put: 'xxx'. client get. reader := NeoJSONReader on: (ZnCharacterReadStream on: client contents). [ reader atEnd] whileFalse: [ reader next ]. reader close. client close.
Be sure to tell us how you got it working.
HTH,
Sven
Hello Sven,
Thanks for your help.
The server I am connecting to requires an account to access. But you provided sufficient information to get me going. Thanks.
This is for a Trading Application. I am a ways off before ready for releasing. I will open source when it is usable and cleaned up enough from personal code.
Currently I have named it SmallTrader, hence the ST prefix for classes.
I have an STClient class which subclasses ZnClient and sets it up with the necessary account authorization.
Below is the STPriceStream#mainLoop method.
Basically it is populating some OrderedCollections in the STPriceStream which are available to the app's mainLoop.
It is working perfectly. I currently have it printing out data to stdout so that I can watch the data it collects to visually understand what is happening.
The connection below is the instance of the class which connects to this specific broker. Since connections are specific to a broker I am putting all of the parsing into ST objects such as STPrice and STCandle in the broker specific class as it understands what the broker returns. This will allow my app to be able to use different brokers simply by changing which connection class we call. Currently I am writing for one specific one where my account is located. But I want to be able to add brokers in time.
Thanks again for your help.
mainLoop | delay pricesStream reader | delay := (Duration milliSeconds: 100) asDelay. minuteDateTime := STCandle datetimeMinute: (DateAndTime now asUTC). pricesStream := connection newPriceStreamConnectionForInstruments: instruments. pricesStream get. reader := STONReader on: (ZnCharacterReadStream on: pricesStream contents). [ reader atEnd] whileFalse: [ stop ifFalse: [ | price | price := connection pricesStreamNextPrice: (reader next). price ifNotNil: [ prices add: price. price datetimeMinute = minuteDateTime ifTrue: [ minutePrices add: price ] ifFalse: [ self processMinutePrices: price ]]] ifTrue: [ reader close ^ self ]. delay wait ].
Jimmie
participants (2)
-
Jimmie Houchin -
Sven Van Caekenberghe