Skip to main content
Scripts:
  • Assets/_MolcaDT/Code/Scripts/Network/NetworkManager.cs
  • Assets/_MolcaDT/Code/Scripts/Network/TokenRenewalManager.cs
  • Assets/_MolcaDT/Code/Scripts/JsonMapping/JsonMappingEvaluator.cs

When to use

Use this page when integrating machine data endpoints/streams and binding JSON payloads to DT panel data models.

Request pipeline (high-level)

NetworkManager exposes coroutine-based HTTP helpers (PostDataCoroutine, PutDataCoroutine, etc.) and attaches auth headers from DT dynamic module setup. It also retries through token-renewal flow when expiration is detected.

Mapping flow

JsonMappingEvaluator.BuildWrapper(JsonMappingAsset mapping, Dictionary<string, object> flat) walks mapping.fields. For each FieldMapping, it looks up flat[f.displayName] (not the JSON path alone unless your flatten step uses the same string as displayName). It fills allData, then categoryData / uniqueCategoryData for panel consumers. APIMapperInvokerBase (and machine-specific invokers) resolve URLs from DigitalTwinDynamicModule.UrlDatum, call NetworkManager coroutines, parse JSON into a flat dictionary, then run JsonMappingEvaluator and raise onDataReceived (full, raw, per-FieldCategory, per unique key).

Code

Manual POST (matches NetworkManager.PostDataCoroutine contract: success → (url, responseBody, true), failure → (url, errorMessage, false)):
using MolcaDT.Network;
using UnityEngine;

public class DtPing : MonoBehaviour
{
    private void Start()
    {
        string url = "https://api.example.com/v1/ping";
        string json = "{}";
        StartCoroutine(NetworkManager.instance.PostDataCoroutine(url, json, OnResponse));
    }

    private void OnResponse(string url, string bodyOrError, bool ok)
    {
        if (!ok) Debug.LogError(bodyOrError);
    }
}
Mapping-only (after you already have a Dictionary<string, object> aligned to FieldMapping.displayName keys):
var wrapper = JsonMappingEvaluator.BuildWrapper(mappingAsset, flatDictionary);
// wrapper.allData, wrapper.categoryData, wrapper.uniqueCategoryData, wrapper.rawData
SSENetworkManager.ConnectToSSE(url, onChunk, filterEvent) streams lines; token refresh can abort and retry the stream when TokenRenewalManager detects expiry patterns.

Troubleshooting

  • 401 / auth errors — Ensure login populated NetworkManager.instance.CurrentAuth; DigitalTwinDynamicModule.SetupAuth() returns a bearer header; configure TokenRenewalManager.tokenExpiredKeyword so IsTokenExpired matches your API’s error body. Use bypassRefreshToken only for isolated tests.
  • SSL / certificate errors in dev — Requests use BypassCertificate (always validates true); prefer proper certs for production builds.
  • Mapping rows missing or null — Flatten JSON so keys equal FieldMapping.displayName in the JsonMappingAsset; empty slots mean TryGetValue missed that key.
  • Panel callbacks silent — In OnDataReceived, wire onFullDataReceived, categoryEvents, or uniqueCategoryEvents; APIMapperInvokerBase caches category hooks from FieldCategory during SyncConfiguration.
  • POST body ignored — Set httpMethod to POST on the invoker and fill postBodyData (see APIMapperInvokerBase).