# gRPC et gRPC-Web

> Un service gRPC derrière Flexway se lit de trois façons : gRPC natif, gRPC-Web depuis un navigateur, et REST/JSON aux routes de ses annotations. C'est une…

Guide - Depuis la version 1.1.0 - Flexway v1.6.3 - https://flexway.io/docs/developer-grpc/

> Un service gRPC derrière Flexway se lit de trois façons : gRPC natif, gRPC-Web depuis un navigateur, et REST/JSON aux routes de ses annotations. C'est **une** opération par méthode.
>
> Côté produit : [gRPC](https://flexway.io/docs/product-grpc/) ; côté exploitation : [Un amont gRPC](https://flexway.io/docs/operations-grpc/).

## gRPC

Le port de trafic de la passerelle sert gRPC (HTTP/2, en clair dans un maillage ou en TLS). Les
métadonnées portent l'identité :

```bash
grpcurl -protoset orders.binpb -H "authorization: Bearer $TOKEN" \
  -d '{"id":"42"}' api.example.com:443 shop.v1.Orders/GetOrder
```

```go
conn, _ := grpc.NewClient("api.example.com:443", grpc.WithTransportCredentials(credentials.NewTLS(nil)))
ctx := metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+token)
order, err := shopv1.NewOrdersClient(conn).GetOrder(ctx, &shopv1.GetOrderRequest{Id: "42"})
```

## REST sur la même méthode

```bash
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/v1/shop/orders/42
```

Un flux serveur arrive en `text/event-stream`. Les flux client et bidirectionnels ne sont servis
qu'en gRPC.

## gRPC-Web depuis un navigateur

Utilisez un client gRPC-Web standard (`grpc-web`, Connect en mode gRPC-Web). L'exploitant doit
autoriser votre origine et exposer `grpc-status`, `grpc-message` et `grpc-status-details-bin` : sans
eux, le navigateur ne peut pas lire un refus.

## Erreurs

| Vous appelez en | Vous recevez |
| --- | --- |
| gRPC, gRPC-Web | `google.rpc.Status` ; le code du problème dans `ErrorInfo.reason` |
| REST | RFC 9457 ; une erreur de l'amont gRPC devient `upstream_status`, son statut gRPC dans l'extension `grpc` |

| Code de la passerelle | Statut gRPC |
| --- | --- |
| `unauthenticated` | `UNAUTHENTICATED` |
| `forbidden` | `PERMISSION_DENIED` |
| `invalid_request`, `malformed_request` | `INVALID_ARGUMENT` |
| `rate_limited`, `quota_exceeded` | `RESOURCE_EXHAUSTED` |
| `upstream_unavailable`, `overloaded` | `UNAVAILABLE` |
| `upstream_timeout` | `DEADLINE_EXCEEDED` |
