Ваша проблема называется «состояние гонки».
Когда вы отлаживаете, вы «достаточно медленны», так что ваш UnityWebRequest
очень вероятно будет иметь результат, пока вы не доберетесь до той части кода, где он необходим.
Пока не выполняется отладка:Вы не ждете до завершения веб-запроса.
поэтому www.downloadHandler.text;
все равно будет иметь значение null
, когда метод достигнет строки
json = JsonUtility.FromJson<TokenClassName>(resultContent);
Я не знаю, что exctaly JsonUtility.FromJson
делает для null
каквходное значение, но я предполагаю, что либо ошибка уже добавлена, либо она может вернуть null
, поэтому следующая строка
token = json.access_token;
при попытке доступа к json
со значением null
выбрасываетисключение.
Вы должны использовать сопрограммы и yield
, пока не получите результат (см. UnityWebRequest.Post ).
Я бы использовал метод обратного вызова, например
private IEnumerator getAuthToken(Action<string> onSuccess)
{
string token = string.Empty;
Dictionary<string, string> content = new Dictionary<string, string>();
TokenClassName json = null;
content.Add("tenant_id", "https//...");
content.Add("grant_type", "client_credentials");
content.Add("client_id", "xxxx");
content.Add("client_secret", "xxxx");
content.Add("resource", "https://...");
UnityWebRequest www = UnityWebRequest.Post("https://login...", content);
//Send request
// !! wait until request finishes
yield return www.SendWebRequest();
if (!www.isNetworkError && !www.isHttpError)
{
string resultContent = www.downloadHandler.text;
json = JsonUtility.FromJson<TokenClassName>(resultContent);
//Return result
token = json.access_token;
// this should only be done on success
// execute the callback
onSuccess?.Invoke(token);
}
else
{
Debug.LogErrorFormat(this, "Downlaod failed with: {0} - \"{1}\"", www.responseCode, www.error);
}
}
, и использовал бы его либо с методом обратного вызова, например
private Start()
{
StartCoroutine(getAuthToken(OnReceivedToken));
}
privtae void OnReceivedToken(string authToken)
{
CustomerGroups data = getCustGroups(authToken);
TextMesh curText = (TextMesh)gameObject.GetComponent(typeof(TextMesh));
curText.text = data.value[0].Field1+ "-" + data.value[0].Field2;
}
, либо в качестве лямбда-выражения
* 1040.*