Table of Contents

Use Observable Queries with cURL

This guide shows you how to work with observable query endpoints by using plain HTTP tools such as curl.

Use this when you want to:

  • confirm the current snapshot for an observable query
  • wait for the first payload before the request returns
  • follow a live Server-Sent Events (SSE) stream
  • emulate long polling with repeated HTTP requests

The same approach works for both model-bound and controller-based observable query endpoints.

Prerequisites

  • You know the observable query URL you want to call.
  • Your application is running.
  • The endpoint already returns an observable query result (ISubject<T>).

Get the current snapshot

A normal GET request returns the current observable snapshot as JSON.

curl "https://localhost:5001/api/orders/observe-all"

Use this when the observable already has a current value and you only want the latest snapshot once.

Wait for the first payload

If the observable does not have a current value yet, add waitForFirstResult=true.

curl "https://localhost:5001/api/orders/observe-all?waitForFirstResult=true"

The request stays open until the observable produces its first payload or the timeout expires.

Override the timeout

The default timeout is 30 seconds. Override it with waitForFirstResultTimeout, expressed in seconds.

curl "https://localhost:5001/api/orders/observe-all?waitForFirstResult=true&waitForFirstResultTimeout=10"

If the timeout expires, Arc returns an HTTP timeout response with a JSON error payload.

Stream updates over SSE

To keep the connection open and watch updates continuously, request the endpoint as Server-Sent Events.

curl --no-buffer \
  -H "Accept: text/event-stream" \
  "https://localhost:5001/api/orders/observe-all"

Each update is sent as an SSE data: frame that contains a serialized QueryResult.

Example output:

data: {"isSuccess":true,"data":[{"id":"...","status":"ready"}],"changeSet":null}

data: {"isSuccess":true,"data":[{"id":"...","status":"shipped"}],"changeSet":null}

Use this when you want a live stream instead of a single JSON response.

Emulate long polling

If you want repeated snapshot requests instead of a continuous stream, call the endpoint in a loop and wait for the first payload each time.

while true; do
  curl --silent \
    "https://localhost:5001/api/orders/observe-all?waitForFirstResult=true&waitForFirstResultTimeout=15"
  echo
done

This is effectively long polling:

  • each request waits until data is available or the timeout expires
  • the server returns a normal JSON payload
  • the client immediately opens a new request

Use this when SSE is not convenient and you still want blocking snapshot requests from plain HTTP tooling.

Pick the right mode

Goal Request style
Get the latest snapshot right now GET /query
Wait until the first payload exists GET /query?waitForFirstResult=true
Wait with a custom timeout GET /query?waitForFirstResult=true&waitForFirstResultTimeout=10
Follow live updates continuously GET /query with Accept: text/event-stream
Repeated blocking snapshot requests Long-poll loop with waitForFirstResult=true

See also