Политика управления потоком API - PullRequest
1 голос
/ 28 января 2020

У меня есть следующие данные запроса

{
   "id": "1115e297-12de-4189-8e11-75a8354f77d6",
   "type": "transaction",
   "version": "1.0.0",
   "data": {
      "account_id": "999",
      "customer_info": {
         "client_id": 999
      },
      "company_id": "999999",
      "event": {
         "id": 99999999,
         "type_code": "3098"
      }
   }
}

Я хочу написать политику, которая игнорирует запрос, если типом не является «транзакция» и тип_кода «3098» или «3099»

Если это не выполняется, то он должен просто вернуть идентификатор запроса вызывающей стороне, а не пересылать запрос

Вот что я придумал

    <choose>
            <when condition="@((string)context.Request.Body?.As<JObject>(true)["type"] != "transaction")">
                <return-response>
                    <set-status code="200" reason="OK" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>application/json</value>
                    </set-header>
                    <set-body>@{ 
                        var json = new JObject( 
                            new JProperty("id", context.Request.Body?.As<JObject>(true)["id"])
                        ); 

                        return json.ToString(); 
                    }</set-body>
                </return-response>
            </when>
            <when condition="@(context.Request.Body?.As<JObject>(true)["data"] == null || context.Request.Body?.As<JObject>(true)["data"]["event"] == null)">
                <return-response>
                    <set-status code="200" reason="OK" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>application/json</value>
                    </set-header>
                    <set-body>@{ 
                        var json = new JObject( 
                            new JProperty("id", context.Request.Body?.As<JObject>(true)["id"])
                        ); 

                        return json.ToString(); 
                    }</set-body>
                </return-response>
            </when>
            <when condition="@((int)context.Request.Body?.As<JObject>(true)["data"]["event"]["type_code"] != 3098 && (int)context.Request.Body?.As<JObject>(true)["data"]["event"]["type_code"] != 3099)">
                <return-response>
                    <set-status code="200" reason="OK" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>application/json</value>
                    </set-header>
                    <set-body>@{ 
                        var json = new JObject( 
                            new JProperty("id", context.Request.Body?.As<JObject>(true)["id"])
                        ); 

                        return json.ToString(); 
                    }</set-body>
                </return-response>
            </when>
        </choose>

I чаевые есть гораздо более элегантный способ сделать это?

1 Ответ

2 голосов
/ 29 января 2020

Конечно. При условии, что все ваши политики return-response одинаковы, вы можете использовать многострочное выражение:

<set-variable name="payload" value="@((string)context.Request.Body?.As<JObject>(true))" />
<choose>
    <when condition="@{
        var payload = (JObject)context.Variables["payload"];
        if (payload?["type"] != "transaction"
            || payload?["data"]?["event"]?["type_code"] != 3099)
        {
            return true;
        }
    }">
        <return-response>
            <set-status code="200" reason="OK" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{ 
                var payload = (JObject)context.Variables["payload"];

                var json = new JObject( 
                    new JProperty("id", payload?["id"])
                ); 

                return json.ToString(); 
            }</set-body>
        </return-response>
    </when>
</choose>
...