# echolot grpc (/fr/docs/cli/grpc)

`echolot grpc` décrit des services gRPC et appelle leurs méthodes, avec des messages écrits en JSON. Il découvre les
services grâce à la réflexion du serveur, ou à un fichier `.proto`. Voir [requêtes gRPC](/docs/requests/grpc) pour la
même chose dans l’app.

| Sous-commande | Effet |
| --- | --- |
| `echolot grpc describe` | Liste les services et les méthodes d’un serveur ou d’un fichier `.proto`, avec les champs de chaque méthode. |
| `echolot grpc call` | Appelle une méthode et affiche la réponse en JSON. |

Les exemples utilisent le service d’inventaire Alpenglow, `specs/inventory.proto` dans l’espace de travail Alpenglow.
Il tourne sur votre Mac à `localhost:50051` ; l’API de démonstration ne peut pas servir du gRPC.

## echolot grpc describe [#echolot-grpc-describe]

```sh
echolot grpc describe [<url>] [--proto <file>] [--header <header> ...] [--insecure] [--timeout <seconds>] [--json]
```

```sh
echolot grpc describe --proto Alpenglow.echolot/specs/inventory.proto
```

```text
Alpenglow.echolot/specs/inventory.proto: 1 service
alpenglow.inventory.v1.Inventory
  ListWarehouses (unary): alpenglow.inventory.v1.ListWarehousesRequest → alpenglow.inventory.v1.ListWarehousesResponse
  WatchStock (server streaming): alpenglow.inventory.v1.WatchStockRequest → alpenglow.inventory.v1.StockLevel
    skus: repeated string
  Reserve (unary): alpenglow.inventory.v1.ReserveRequest → alpenglow.inventory.v1.Reservation
    sku: string
    quantity: int32
    orderId: string
```

Donnez un serveur à la place (`echolot grpc describe http://localhost:50051`) pour interroger son service de
réflexion. Chaque méthode indique si elle est unaire, à flux serveur, à flux client ou bidirectionnelle, ses types de
requête et de réponse, et les champs de sa requête.

| Option | Signification |
| --- | --- |
| `<url>` | Le serveur, `http://host:port` ou `https://host:port`. Inutile avec `--proto`. |
| `--proto <file>` | Un fichier `.proto` qui décrit le service, avec ses imports à côté. Sans lui, la réflexion du serveur est interrogée. |
| `-H`, `--header <header>` | Des métadonnées sous la forme `'Name: value'`. Répétable. |
| `-k`, `--insecure` | Ne pas vérifier le certificat TLS. |
| `--timeout <seconds>` | Secondes d’attente de l’appel entier. 30 par défaut. |
| `--json` | Afficher la description en JSON. |

## echolot grpc call [#echolot-grpc-call]

```sh
echolot grpc call <url> <method> [--data <json>] [--deadline <ms>] [--compress <algorithm>] [--proto <file>] [--header <header> ...] [--insecure] [--timeout <seconds>]
```

`<method>` est `package.Service/Method`. Le message est du JSON, `{}` par défaut ; `-d -` le lit depuis l’entrée
standard. Pour une méthode à flux client, donnez un tableau : chaque élément est un message. La réponse s’affiche en
JSON sur la sortie standard.

```sh
echolot grpc call http://localhost:50051 alpenglow.inventory.v1.Inventory/Reserve \
  -d '{"sku": "TNT-MH-2P", "quantity": 1, "orderId": "ord_7Hk2Lw"}' \
  --proto Alpenglow.echolot/specs/inventory.proto
```

L’état, le nombre de messages reçus et la durée vont sur la sortie d’erreur. Un état autre que `OK` se termine avec le
code 1.

| Option | Signification |
| --- | --- |
| `-d`, `--data <json>` | Le message en JSON ; `-` le lit depuis l’entrée standard. `{}` par défaut. |
| `--deadline <ms>` | L’échéance en millisecondes, envoyée sous la forme `grpc-timeout`. |
| `--compress <algorithm>` | Compresser les messages envoyés : `gzip` ou `deflate`. Les réponses compressées sont lues dans tous les cas. |
| `--proto <file>` | Un fichier `.proto` qui décrit le service, avec ses imports à côté. Sans lui, la réflexion du serveur est interrogée. |
| `-H`, `--header <header>` | Des métadonnées sous la forme `'Name: value'`. Répétable. |
| `-k`, `--insecure` | Ne pas vérifier le certificat TLS. |
| `--timeout <seconds>` | Secondes d’attente de l’appel entier. 30 par défaut. |

`http://` parle HTTP/2 sans TLS ; `https://` utilise TLS. Les types connus (`google.protobuf.Timestamp` et les autres)
sont intégrés : un fichier `.proto` qui les importe n’a donc besoin de rien à côté.

## Codes de sortie [#exit-codes]

| Code | Quand |
| --- | --- |
| `0` | `describe` a trouvé les services ; `call` s’est terminé avec l’état `OK`. |
| `1` | Le serveur n’a pas pu être joint ou décrit, ou l’état de l’appel n’était pas `OK`. |
| `64` | Une option erronée. |
