Извлечь нестроковое значение из объекта ответа

В APIM я хочу получить OAuth токен перед вызовом серверной части и сохранить его в APIM кеше.

Мне удалось получить жетон OAuth.

Я хочу сохранить свой токен в кеше, для этого мне нужна продолжительность. Моя проблема - извлечь продолжительность из тела ответа.

Сначала я извлекаю токен и продолжительность, чтобы сохранить их в переменных. Затем переменные используются для хранения значения в кеше.

При извлечении целочисленного значения "expires_in" это не удается.

Объект ответа:

{
    "access_token": "accesstokenresponse",
    "token_type": "bearer",
    "expires_in": 3600
}

извлечение данных и ввод переменных:

<set-variable name="bearer-token" 
    value="@(((IResponse)context.Variables["response"]).Body.As<JObject>()["access_token"].ToString())" />

<set-variable name="expires-in" 
    value="@(((IResponse)context.Variables["response"]).Body.As<JObject>(preserveContent: true)["expires_in"].ToString())" />

хранение в кеше:

<cache-store-value key="OAuthKey" 
    value="@((string)context.Variables["bearer-token"])"
    duration="@((int)context.Variables["expires-in"])" />

Извлечение expires_in приводит к тому, что ссылка на объект не установлена ​​на экземпляр объекта.

set-variable (153.612 ms)
{
    "messages": [
        {
            "message": "Expression evaluation failed.",
            "expression": "((IResponse)context.Variables[\"response\"]).Body.As<JObject>(preserveContent: true)[\"expires_in\"].ToString()",
            "details": "Object reference not set to an instance of an object."
        },
        "Expression evaluation failed. Object reference not set to an instance of an object.",
        "Object reference not set to an instance of an object."
    ]
}

person PR33T0    schedule 20.09.2019    source источник


Ответы (1)


Попытайтесь сохранить значение объектов, используя (preserveContent: true) в первой строке, таким образом:

value="@(((IResponse)context.Variables["response"]).Body.As<JObject>(preserveContent:true)["access_token"].ToString())" />

Сообщите мне, если проблема решена.

person Edifirst    schedule 20.09.2019
comment
В дополнение к этому вам также необходимо получить значение как int. Прямо сейчас вы получаете его как строку (вызов .ToString), но затем преобразуете эту переменную в int. Сначала попробуйте получить его как int int: (int) (... [expires-in]) - person Vitaliy Kurokhtin; 21.09.2019