# Browsers, gRPC-Web, Connect and Gateways — gRPC

Source: https://www.skillbyai.com/en/grpc/e-browser

> Reaching clients that cannot speak gRPC.

## Bridging the gap

Browsers cannot control HTTP/2 framing and trailers directly, so they cannot call native gRPC. **gRPC-Web** is a variant protocol that browsers can use, usually through a proxy such as Envoy. The **Connect** protocol (from Buf) works over HTTP/1.1 and HTTP/2 with JSON or binary and is compatible with gRPC servers that support it. **grpc-gateway** and Envoy's transcoding generate REST/JSON endpoints from proto annotations, so external clients use plain HTTP.

## REST mapping with HTTP annotations

google.api.http options used by grpc-gateway and transcoding proxies.

```protobuf
import "google/api/annotations.proto";

service OrderService {
  rpc GetOrder(GetOrderRequest) returns (Order) {
    option (google.api.http) = { get: "/v1/orders/{id}" };
  }
  rpc CreateOrder(CreateOrderRequest) returns (Order) {
    option (google.api.http) = { post: "/v1/orders" body: "order" };
  }
}
```

## Keep one source of truth

Generating REST endpoints from the same proto avoids maintaining two diverging APIs.

**Quiz:** Why can browsers not call native gRPC directly?

- [ ] Browsers do not support HTTPS
- [x] Browser APIs do not give enough control over HTTP/2 framing and trailers
- [ ] Protobuf is illegal in browsers
- [ ] gRPC requires UDP

*Answer:* Browser APIs do not give enough control over HTTP/2 framing and trailers. Use gRPC-Web, Connect or a gateway.
