# Application de workflow RESTAPICLIENT

## Aperçu

L'application de workflow **RESTAPICLIENT** vous permet d'appeler des points de terminaison de l'API REST pour échanger des informations avec d'autres applications via des requêtes HTTP. Elle peut également être utilisée pour créer des intégrations avec des applications extensibles (telles que les services Azure et Slack).

RESTAPICLIENT vous permet également d'appeler un point de terminaison de l'API REST à l'aide de charges utiles `application/json` ou `application/x-www-form-urlencoded`. RESTAPICLIENT recevra et traitera ensuite la réponse de l'API externe en mappant le contenu de la réponse avec les paramètres OUT définis.

## Mode de fonctionnement

* L'application RESTAPICLIENT requiert le paramètre `APP_URL`, qui correspond au point de terminaison de l'API REST.<br>
* Le type de contenu du charge utile de demande par défaut (`APP_REQUEST_CONTENT_TYPE`) est `application/json`. Le type de contenu `application/x-www-form-urlencoded` est également supporté.<br>
* La méthode de requête HTTP de demande par défaut (`APP_METHOD`) est GET. D'autres méthodes de requête (`POST`, `PUT`, `DELETE`, etc...) sont également supportées.<br>
* En cas d'erreur, lorsque le paramètre IN `APP_RESPONSE_IGNORE_ERROR` est défini et que sa valeur est `Y`, l'erreur est ignorée et les paramètres OUT définis (`APP_RESPONSE_STATUS` ou `APP_RESPONSE_CONTENT`) sont mappés. Sinon, une exception sera levée.<br>
* Les paramètres de l’application étant sensibles à la casse, ils doivent utiliser la notation acceptée par l’API.<br>
* Le délai d'expiration de la demande par défaut est de 3 000 millisecondes; cette valeur par défaut peut être modifiée en définissant la valeur du paramètre `RestApiClientRequestTimeout` dans le fichier `web.config`. Le délai d'expiration de la demande peut également être défini dans le paramètre IN `APP_TIMEOUT`; le délai d'expiration maximum est de 60 000 millisecondes (1 heure).\
  \
  ✏️ **Note :** Cette valeur de délai d'expiration doit être inférieure à la valeur de délai d'expiration de la demande IIS.<br>
* Les en-têtes de requête HTTP peuvent être définis avec les paramètres `APP_HEADER_xxx`, où `xxx` est le nom du champ d'en-tête. Pour plus d'informations, voir la section [Paramètres d'en-tête](#parametres-den-tete).<br>
* La charge utile de la demande peut être définie dans les paramètres IN `APP_REQUEST_CONTENT_FILE` ou `APP_REQUEST_CONTENT`. Lorsque les deux paramètres sont définis, le paramètre `APP_REQUEST_CONTENT_FILE` est prioritaire. Pour plus d'informations sur ces paramètres, voir la section [Charge utile de demande](#charge-utile-de-demande).<br>
* La réponse de l'API REST peut être mappée sur les paramètres OUT `APP_RESPONSE_CONTENT_FILE` ou `APP_RESPONSE_CONTENT`. Les deux paramètres peuvent être définis en même temps. Pour plus d'informations sur ces paramètres, voir la section [Charge utile de réponse](#charge-utile-de-reponse).<br>
* Outre les paramètres facultatifs listés ci-dessous, vous pouvez également ajouter des paramètres supplémentaires IN et OUT personnalisés pour envoyer et recevoir des données personnalisées définies par l'utilisateur vers et depuis l'API externe. Pour plus d'informations et des exemples sur ces paramètres IN et OUT personnalisés, voir les sections [Charge utile de demande](#charge-utile-de-demande) et [Charge utile de réponse](#charge-utile-de-reponse).<br>
* L'application supporte le langage de requête JSONPath (voir <https://github.com/json-path/JsonPath>), qui permet d'extraire des données spécifiques à partir d'une réponse JSON (similaire aux expressions XPath en XML). Pour plus d'informations sur l'utilisation de cette application avec des exemples, voir la section [Charge utile de réponse](#charge-utile-de-reponse).<br>
* Des logs d'application sont disponibles. Ceux-ci peuvent être spécifiés en définissant la valeur du paramètre `RestApiClientLogLevel` dans le fichier `web.config` sur `0` pour désactiver la journalisation, `1` pour les logs simples ou `2` pour les logs de débogage; la valeur par défaut est `0`.<br>
* La longueur de réponse maximale par défaut est de 4194304 caractères (4 Mo); cette valeur par défaut peut être modifiée en définissant la valeur du paramètre `RestApiClientMaxResponseLength` dans le fichier `web.config`.<br>
* La suppression automatique des fichiers temporaires peut être désactivée en définissant la valeur du paramètre `RestApiClientEnableFilesCleanUp` sur `N` dans le fichier `web.config`; la valeur par défaut est `Y`.<br>

## Paramètre obligatoire

| Paramètre | Type | Direction | Description          |
| --------- | ---- | --------- | -------------------- |
| `APP_URL` | Text | IN        | URL de l'API externe |

## Paramètres facultatifs

### Général

| Paramètre                   | Type    | Direction | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| --------------------------- | ------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_TIMEOUT`               | Numeric | IN        | <p>Intervalle de temps maximum entre l'envoi de la demande et la réception de la réponse</p><p></p><p>La valeur par défaut est 3 000 millisecondes et le maximum est 60 000 millisecondes. La valeur par défaut peut être modifiée en définissant la valeur du paramètre <code>RestapiClientRequestTimeout</code> dans le fichier <code>web.config</code>.</p><p></p><p>✏️ <strong>Note :</strong> Cette valeur de délai d'expiration doit être inférieure à la valeur de délai d'expiration de la demande IIS.</p> |
| `APP_METHOD`                | Text    | IN        | <p>Méthode d'API</p><p></p><p>La valeur par défaut est <code>GET</code>. <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, <code>HEAD</code> et <code>PATCH</code> sont également supportés.</p>                                                                                                                                                                                                                                                                                                            |
| `APP_REQUEST_CONTENT_TYPE`  | Text    | IN        | <p>Type de contenu de requête supporté par l'API externe</p><p></p><p>L’application supporte <code>application/json</code> et <code>application/x-www-form-urlencoded</code>); la valeur par défaut est <code>application/json</code>.</p>                                                                                                                                                                                                                                                                          |
| `APP_RESPONSE_IGNORE_ERROR` | Text    | IN        | Lorsque défini sur `Y`, l'application ignore l'erreur lorsqu'une exception `WebException` se produit ou que l'API externe renvoie un statut de réponse supérieur ou égal à `300`; la valeur par défaut est `N`.                                                                                                                                                                                                                                                                                                     |

### Paramètres `APP_URL` facultatifs

| Paramètre     | Type | Direction | Description                                                                |
| ------------- | ---- | --------- | -------------------------------------------------------------------------- |
| `APP_URL_xxx` | Text | IN        | Paramètre facultatif d'URL de l'API où `xxx` est le nom du paramètre d'URL |

📌 **Exemple**

| Paramètre                   | Type | Direction | Valeur                                                                                                                                            |
| --------------------------- | ---- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_URL`                   | Text | IN        | `https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.EventGrid/topics/{topicName}` |
| `APP_URL_subscriptionId`    | Text | IN        | `457a2a46-7a7f-4afa-940d-8779e1425fa8`                                                                                                            |
| `APP_URL_resourceGroupName` | Text | IN        | `dev-group-advantys`                                                                                                                              |
| `APP_URL_topicName`         | Text | IN        | `dev-topic`                                                                                                                                       |

Les paramètres définis ci-dessus généreront l'URL suivante dans `APP_URL` :

```
https://management.azure.com/subscriptions/457a2a46-7a7f-4afa-940d-8779e1425fa8/resourceGroups/dev-group-advantys/providers/Microsoft.EventGrid/topics/dev-topic
```

### Paramètres d'en-tête

| Paramètre        | Type | Direction | Description                                                                  |
| ---------------- | ---- | --------- | ---------------------------------------------------------------------------- |
| `APP_HEADER_xxx` | Text | IN        | Paramètres d'en-tête de l'API externe où `xxx` est le nom du champ d'en-tête |

📌 **Exemple**

| Paramètre                  | Type | Direction | Valeur                |
| -------------------------- | ---- | --------- | --------------------- |
| `APP_HEADER_Authorization` | Text | IN        | `Bearer AbCdEf123456` |
| `APP_HEADER_location`      | Text | IN        | `canadaeast`          |

Les paramètres définis ci-dessus généreront deux en-têtes dans la charge utile de la demande :

```
Authorization: Bearer AbCdEf123456
location: canadaeast
```

### Paramètres d'autorisation

L'application supporte également certains paramètres d'en-tête d'autorisation prédéfinis afin d'éviter d'ajouter ces paramètres d'en-tête HTTP avec le nom de paramètre `APP_HEADER_xxx`.

| Paramètre                 | Type | Direction | Description                                                                                                                                                           |
| ------------------------- | ---- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_AUTH_BASIC_USERNAME` | Text | IN        | Nom d'utilisateur de base de l'autorisation API                                                                                                                       |
| `APP_AUTH_BASIC_PASSWORD` | Text | IN        | <p>Mot de passe de base de l'autorisation API</p><p>API authorization Basic password; doit être utilisé avec le paramètre <code>APP\_AUTH\_BASIC\_USERNAME</code></p> |
| `APP_AUTH_BEARER_TOKEN`   | Text | IN        | Jeton du porteur de l'autorisation API                                                                                                                                |
| `APP_AUTH_AZ_SAS_TOKEN`   | Text | IN        | Jeton SAS Azure de l'autorisation API                                                                                                                                 |

{% hint style="info" %}

* Un seul en-tête d'autorisation peut être défini, sinon une exception est levée.<br>
* `APP_AUTH_BEARER_TOKEN` équivaut à définir le paramètre d'en-tête `APP_HEADER_Authorization`.&#x20;
  {% endhint %}

### Charge utile de demande

Il existe deux manières différentes de préparer la charge utile de demande. La première consiste à accéder à la totalité de la charge de demande (voir **Définir la charge utile de la demande entière via un paramètre** ci-dessous); la seconde consiste à créer le JSON ou l'URL codée via les paramètres IN (voir les sections **Charge utile de demande encodée en URL** et la **Charge utile de demande JSON** ci-dessous.

#### **Définir la charge utile de demande entière via un paramètre**

Les paramètres suivants peuvent être utilisés lorsque vous avez accès à l'ensemble de la charge utile de demande ou que le type de contenu de la demande n'est pas `application/json` ni `application/x-www-form-urlencoded`. Vous pouvez définir la charge de cette demande dans une donnée de type File ou Text ou directement dans la valeur de texte.

| Paramètre                  | Type | Direction | Description                               |
| -------------------------- | ---- | --------- | ----------------------------------------- |
| `APP_REQUEST_CONTENT_FILE` | File | IN        | Demander une charge utile dans un fichier |
| `APP_REQUEST_CONTENT`      | Text | IN        | Charge utile de la demande                |

{% hint style="info" %}

* `APP_REQUEST_CONTENT_FILE`a la priorité sur `APP_REQUEST_CONTENT`.<br>
* `APP_REQUEST_CONTENT` a la priorité sur les paramètres IN utilisés pour créer une charge utile JSON ou encodée en URL.
  {% endhint %}

**Charge utile de demande encodée en URL**

Les exemples suivants montrent comment créer une charge utile de demande avec `application/x-www-form-urlencoded` comme type de contenu.

**Charge utile de demande en URL standard**

Les paramètres suivants sont utilisés pour créer une charge utile de demande  encodée en URL standard :

| Paramètre | Type | Direction | Description |
| --------- | ---- | --------- | ----------- |
| `param1`  | Text | IN        | `value1`    |
| `param2`  | Text | IN        | `value2`    |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
param1=value1&param2=value2
```

**Charge utile de demande JSON encodée dans un nom de clé**

Les paramètres suivants permettent de générer une charge JSON encodée dans un nom de clé :

| Paramètre                          | Type | Direction | Description |
| ---------------------------------- | ---- | --------- | ----------- |
| `param1`                           | Text | IN        | `value1`    |
| `param2`                           | Text | IN        | `value2`    |
| `APP_REQUEST_CONTENT_PAYLOAD_NAME` | Text | IN        | `payload`   |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
payload: { param1: "value1", "param2": "value2" }
```

{% hint style="info" %}
Le paramètre `APP_REQUEST_CONTENT_PAYLOAD_NAME` est seulement supporté avec le type de contenu de demande `application/x-www-form-urlencoded`.
{% endhint %}

**Charge utile de demande JSON**

Les exemples suivants montrent comment créer une charge utile de demande avec `application/json` comme type de contenu.

**Charge utile de demande JSON standard**

Les paramètres suivants sont utilisés pour créer une charge utile de demande JSON simple :

| Paramètre                | Type | Direction | Valeur           |
| ------------------------ | ---- | --------- | ---------------- |
| `person.address.street`  | Text | IN        | `160 Guy Street` |
| `person.address.zipcode` | Text | IN        | `J4G 1U4`        |
| `person.age`             | Text | IN        | `30`             |
| `person.name`            | Text | IN        | `John`           |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
{
    "person": {
        "address": {
            "street": "160 Guy Street",
            "zipcode": "J4G 1U4"
        },
        "age": 30,
        "name": "John"
    }
}
```

Si vous souhaitez convertir ce JSON en tableau, vous devez définir la valeur du paramètre `APP_REQUEST_CONTENT_IS_ARRAY` sur `Y`.

| Paramètre                      | Type | Direction | Description                                                                                                                                                                                                                                                                                      |
| ------------------------------ | ---- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `APP_REQUEST_CONTENT_IS_ARRAY` | Text | IN        | <p>Lorsque ce paramètre est défini sur <code>Y</code>, l'application convertit la charge utile de la demande JSON en un tableau; la valeur par défaut est <code>N</code></p><p></p><p>Uniquement supporté lors de la construction d'une charge utile de demande JSON avec des paramètres IN.</p> |

Le paramètre `APP_REQUEST_CONTENT_IS_ARRAY` défini sur `Y` générera la charge utile de demande suivante :

```
[{
    "person": {
        "address": {
            "street": "160 Guy Street",
            "zipcode": "J4G 1U4"
        },
        "age": 30,
        "name": "John"
    }
}]
```

Pour savoir comment créer un JSON plus complexe, voir les sections **Définition d'un tableau JSON dans une propriété JSON** et **Définition d'un objet ou d'un tableau JSON dans une propriété JSON avec le paramètre de suffixe `__JSON`** ci-dessous.

**Définition d'un tableau JSON dans une propriété JSON**

Pour définir un tableau dans une propriété JSON, vous devez définir le chemin de la propriété (par exemple, `person.spokenlanguages`) suivi du suffixe `__X`, où `X` est le numéro d'index du tableau.

Les paramètres suivants permettent de définir un tableau JSON dans une propriété JSON :

| Paramètre                   | Type | Direction | Valeur    |
| --------------------------- | ---- | --------- | --------- |
| `person.spokenlanguages__0` | Text | IN        | `french`  |
| `person.spokenlanguages__1` | Text | IN        | `english` |
| `person.spokenlanguages__2` | Text | IN        | `chinese` |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
{
    "person": {
        "spokenlanguages": ["french", "english", "chinese"]
    }
}
```

Si vous souhaitez définir un tableau JSON d'objets JSON (p.ex. `"spokenlanguages": [{"spokenlanguage":"french"}, {"spokenlanguage":"english"}]`) dans une propriété JSON, voir la section suivante.

{% hint style="warning" %}

* Les paramètres du tableau seront ordonnés en fonction de leur numéro d'index.<br>
* Les numéros index n'ont pas de limite (p.ex. `person.spokenlanguages__9999`).<br>
* Une séquence d'index correcte n'est pas obligatoire (p.ex.`person.spokenlanguages__90`, `person.spokenlanguages__30`). La valeur du paramètre `__30` sera le premier paramètre de tableau et `__90` sera le deuxième.<br>
* Une exception sera levée si plusieurs propriétés JSON sont spécifiées dans les paramètres IN (p.ex. `person.spokenlanguages` et`person.spokenlanguages__0`).<br>
* Le suffixe `__X` utilise **deux** caractères de soulignement.<br>
* La valeur du paramètre ne peut être qu'une valeur de texte.
  {% endhint %}

**Définition d'un objet ou d'un tableau JSON dans une propriété JSON avec le paramètre de suffixe `__JSON`**

Pour définir un objet / un tableau JSON dans une propriété JSON, vous devez définir le chemin de la propriété (p.ex. `person.children`) suivi du suffixe `__JSON` avec l'objet ou le tableau JSON comme valeur de paramètre.

Les paramètres suivants permettent de définir un objet ou un tableau JSON dans une propriété JSON:

| Paramètre               | Type | Direction | Valeur                                       |
| ----------------------- | ---- | --------- | -------------------------------------------- |
| `person.children__JSON` | Text | IN        | `[{"name": "child 1"}, {"name": "child 2"}]` |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
{
    "person": {
        "children": [{
            "name": "child 1"
        }, {
            "name": "child 2"
        }]
    }
}
```

{% hint style="warning" %}

* Une exception sera levée si plusieurs propriétés JSON sont spécifiées dans les paramètres IN (p.ex. `person.children`et`person.children__JSON`).<br>
* Le suffixe `__JSON` utilise **deux** caractères de soulignement.
  {% endhint %}

### Charge utile de réponse

L'application supporte le mappage des paramètres OUT avec la réponse HTTP :

| Paramètre                       | Type         | Direction | Description                                                                                                                                                        |
| ------------------------------- | ------------ | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `APP_RESPONSE_STATUS`           | Text/Numeric | OUT       | Code statut de la réponse                                                                                                                                          |
| `APP_RESPONSE_CONTENT_TYPE`     | Text         | OUT       | Type de contenu de la réponse                                                                                                                                      |
| `APP_RESPONSE_CONTENT_FILE`     | File         | OUT       | Charge utile de la réponse ou message d'erreur dans un fichier                                                                                                     |
| `APP_RESPONSE_CONTENT`          | Text         | OUT       | Charge utile de la réponse ou message d'erreur                                                                                                                     |
| `APP_RESPONSE_CONTENT_IS_ARRAY` | Text         | OUT       | <p>Renvoie <code>Y</code> si la charge JSON est un tableau</p><p></p><p>Seulement supporté pour les réponses de type de contenu <code>application/json</code>.</p> |

#### Mappage d'une charge utile de réponse JSON avec des paramètres OUT

L'application supporte également des paramètres OUT personnalisés supplémentaires pour mapper la charge utile d'une réponse JSON simple.

📌 **Exemple**

Charge utile de réponse JSON :

```
{
    "person": {
        "address": {
            "street": "160 Guy Street",
            "zipcode": "J4G 1U4"
        },
        "age": 30,
        "name": "John"
    }
}
```

Les paramètres suivants permettront de mapper la charge utile de la réponse dans différentes données de processus :

| Paramètre                | Type | Direction | Récupérer la valeur dans une donnée |
| ------------------------ | ---- | --------- | ----------------------------------- |
| `person.address.street`  | Text | OUT       | `DATA_STREET`                       |
| `person.address.zipcode` | Text | OUT       | `DATA_ZIPCODE`                      |
| `person.age`             | Text | OUT       | `DATA_AGE`                          |
| `person.name`            | Text | OUT       | `DATA_NAME`                         |

Pour mapper des JSON complexes, voir la section suivante.

#### Mappage d'une charge utile de réponse JSON avec des paramètres OUT à l'aide du langage de requête JSONPath

L'application supporte le langage de requête JSONPath (similaire aux expressions XPath en XML). Ce langage vous permet d'extraire des données spécifiques d'un fichier JSON. Pour plus de détails sur la syntaxe JSONPath, voir <https://github.com/json-path/JsonPath>.

📌 **Exemple**

Charge utile de réponse JSON :

```
{
    "person": {
      "name": "Elizabeth",
      "age": 85,
      "dob": "1937-09-23T00:00:00Z",
      "children": [
        {
          "name": "Charles",
          "age": 60,
          "children": [
            {
              "name": "Nathalie",
              "children": [
                {
                  "name": "George",
                  "age": 8
                },
                {
                  "name": "Charlotte",
                  "age": 10
                },
                {
                  "name": "Jefferson",
                  "age": 7
                }
              ]
            },
            {
              "name": "Harry"
            }
          ]
        },
        {
          "name": "Bob",
          "age": 57,
          "children": [
            {
              "name": "John"
            },
            {
              "name": "Mark"
            }
          ]
        }
      ]
    }
}
```

Par exemple, nous voulons ici obtenir les noms des petits-enfants de Charles âgés de plus de sept ans, et nous voulons également que ces noms soient séparés par un `|` (en utilisant le paramètre IN `APP_JSONPATH_DELIMITER`). En même temps, nous allons récupérer l'âge et la date de naissance d'Elizabeth. Pour obtenir ces informations, les paramètres suivants doivent être définis :

| Paramètre                | Type     | Direction | Valeur IN                                                                         | Valeur OUT                                                   |
| ------------------------ | -------- | --------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| `APP_JSONPATH_DELIMITER` | Text     | IN        | `\|`                                                                              |                                                              |
| `PARAM1__JSONPATH`       | Text     | INOUT     | `person.children[?(@.name == 'Charles')].children[*].children[?(@.age > 7)].name` | donnée `DATA1_VALUE` (la valeur sera : `George\|Charlotte`)  |
| `AGE__JSONPATH`          | Text     | IN        | `$.person.age`                                                                    |                                                              |
| `AGE`                    | Numeric  | OUT       |                                                                                   | donnée `AGE_VALUE` (la valeur sera : `85`)                   |
| `DOB__JSONPATH`          | Text     | IN        | `$.person.dob`                                                                    |                                                              |
| `DOB`                    | DateTime | OUT       |                                                                                   | donnée `DOB_VALUE` (la valeur sera : `1937-09-23T00:00:00Z`) |

{% hint style="warning" %}

* Dans le nom du paramètre `PARAM1__JSONPATH`, le nom de `PARAM1` n'est pas pertinent, mais il doit être suivi du suffixe `__JSONPATH` (**deux** traits de soulignement sont utilisés dans le suffixe).<br>
* Pour récupérer une valeur dans une donnée de type **Text**, vous pouvez utiliser un seul paramètre en INOUT (par exemple, le paramètre `PARAM1__JSONPATH` comme ci-dessus).<br>
* Pour récupérer une valeur dans une donnée de type **Numeric** ou **DateTime**, vous **devez** utiliser des paramètres distincts : un paramètre IN de type Text pour la requête JSONPath et un paramètre OUT pour associer à la donnée en Numeric ou DateTime. Les deux paramètres doivent partager le même préfixe de nom (par exemple, les paramètres `AGE__JSONPATH` et `AGE` comme ci-dessus).<br>
* La valeur par défaut de `APP_JSONPATH_DELIMITER` est une virgule (`,`) lorsque ce paramètre n'est pas défini.
  {% endhint %}

## Exemple d'utilisation avec l'API Azure REST pour obtenir un jeton d'accès OAuth 2.0 et créer une rubrique Event Grid

Cet exemple montre comment obtenir un jeton d'accès et l'utiliser pour créer une rubrique Event Grid. Cela peut être fait en créant un processus avec deux actions ayant RESTAPICLIENT comme application. Le workflow ci-dessous illustre cet exemple :

<div align="left"><img src="https://user-images.githubusercontent.com/22150605/56391674-54de8480-61fd-11e9-8b6b-5645563e0d6d.png" alt=""></div>

Les sections suivantes décrivent les paramètres à déclarer pour chaque action.

### Action `GET_TOKEN` : Obtention d'un jeton d'accès OAuth 2.0

Les paramètres suivants sont nécessaires pour obtenir un jeton d'accès afin d'utiliser l'API de gestion Azure Resource. Ce jeton sera stocké dans le paramètre OUT `access_token` et sera utilisé lors de la création d'une rubrique Event Grid dans la section suivante.

| Paramètre                  | Type | Direction | Valeur                                                      |
| -------------------------- | ---- | --------- | ----------------------------------------------------------- |
| `APP_URL`                  | Text | IN        | `https://login.microsoftonline.com/{tenandId}/oauth2/token` |
| `APP_URL_tenantId`         | Text | IN        | `a6e70c61-fabd-4885-89f7-97121e92db7f`                      |
| `APP_METHOD`               | Text | IN        | `POST`                                                      |
| `APP_REQUEST_CONTENT_TYPE` | Text | IN        | `application/x-www-form-urlencoded`                         |
| `grant_type`               | Text | IN        | `client_credentials`                                        |
| `client_id`                | Text | IN        | `b7e29e2f-6e2b-4375-9684-8151431d4ca6`                      |
| `client_secret`            | Text | IN        | `lxy/IwKyTedHUWMeeUtyCtu7/YUy0rNGoY3NNWXXotI=`              |
| `resource`                 | Text | IN        | `https://management.core.windows.net/`                      |
| `access_token`             | Text | OUT       | `DATA_ACCESS_TOKEN`                                         |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
POST https://login.microsoftonline.com/a6e70c61-fabd-4885-89f7-97121e92db7f/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=b7e29e2f-6e2b-4375-9684-8151431d4ca6&client_secret=lxy/IwKyTedHUWMeeUtyCtu7/YUy0rNGoY3NNWXXotI=&resource=https://management.core.windows.net/
```

Voici la réponse de l'API Azure :

```
{  
   "token_type":"Bearer",
   "expires_in":"3600",
   "ext_expires_in":"3600",
   "expires_on":"1555951493",
   "not_before":"1555947593",
   "resource":"https://management.core.windows.net/",
   "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1d..."
}
```

{% hint style="warning" %}
Le paramètre OUT `access_token` est mappé avec la propriété JSON `access_token`.
{% endhint %}

Pour plus d'informations sur l'obtention d'un jeton d'accès pour utiliser l'API de ressource Azure, voir <https://docs.microsoft.com/fr-fr/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow>.

### Action `CREATE_TOPIC` : création d'une rubrique Event Grid

Les paramètres suivants sont nécessaires pour créer une rubrique Event Grid à l'aide de l'API de gestion des ressources Azure.

| Paramètre                   | Type | Direction | Valeur                                                                                                                                                                      |
| --------------------------- | ---- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_URL`                   | Text | IN        | `https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.EventGrid/topics/{topicName}?api-version={api-version}` |
| `APP_URL_subscriptionId`    | Text | IN        | `235765d9-5d62-43f4-a730-2ed71a3f8adb`                                                                                                                                      |
| `APP_URL_resourceGroupName` | Text | IN        | `dev-group-advantys`                                                                                                                                                        |
| `APP_URL_topicName`         | Text | IN        | `new-topic-example`                                                                                                                                                         |
| `APP_URL_api-version`       | Text | IN        | `2018-09-15-preview`                                                                                                                                                        |
| `APP_METHOD`                | Text | IN        | `PUT`                                                                                                                                                                       |
| `APP_REQUEST_CONTENT_TYPE`  | Text | IN        | `application/json`                                                                                                                                                          |
| `APP_AUTH_BEARER_TOKEN`     | Text | IN        | `DATA_ACCESS_TOKEN`                                                                                                                                                         |
| `location`                  | Text | IN        | `canadaeast`                                                                                                                                                                |

Les paramètres définis ci-dessus généreront la charge utile de demande suivante :

```
PUT https://management.azure.com/subscriptions/235765d9-5d62-43f4-a730-2ed71a3f8adb/resourceGroups/dev-group-advantys/providers/Microsoft.EventGrid/topics/new-topic-example?api-version=2018-09-15-preview
Host: management.azure.com
Content-Type: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1d...
location: canadaeast
```

Voici la réponse de l'API Azure:

```
{  
   "properties":{  
      "provisioningState":"Creating",
      "endpoint":null
   },
   "location":"canadaeast",
   "tags":null,
   "id":"/subscriptions/994e2fc0-937d-4110-b355-e7473acef822/resourceGroups/dev-evt-grid/providers/Microsoft.EventGrid/topics/test-from-wfg",
   "name":"test-from-wfg",
   "type":"Microsoft.EventGrid/topics"
}
```

Pour plus d'informations sur la création d'une rubrique Event Grid et sur l'API Azure REST, voir <https://docs.microsoft.com/fr-fr/rest/api/eventgrid/topics/createorupdate>.

## Activation de SSL / TLS

En cas d'erreur `Impossible de créer le canal sécurisé SSL / TLS`, le chiffrement renforcé doit être activé en exécutant le code suivant dans PowerShell :

```csharp
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
```

{% hint style="warning" %}
Redémarrez votre serveur IIS après avoir exécuté les commandes.
{% endhint %}
