{"id":49371,"date":"2025-05-19T01:26:27","date_gmt":"2025-05-19T01:26:27","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49371"},"modified":"2026-02-21T07:28:34","modified_gmt":"2026-02-21T07:28:34","slug":"grpc-rest-graphql-websocket-a-example","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/grpc-rest-graphql-websocket-a-example\/","title":{"rendered":"gRPC REST GraphQL &amp; WebSocket &#8211; A example"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-5-1024x683.png\" alt=\"\" class=\"wp-image-49372\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-5-1024x683.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-5-300x200.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-5-768x512.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/05\/image-5.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>That&#8217;s a great question. The reason it&#8217;s hard to <strong>visually spot<\/strong> the difference in a gRPC request is because it&#8217;s a <strong>binary protocol over HTTP\/2<\/strong>, unlike human-readable formats like REST (JSON) or GraphQL (JSON). But let&#8217;s break it down for you in a <strong>side-by-side comparison<\/strong>, using the same logical operation \u2014 <strong>a simple <code>SayHello(name)<\/code> API<\/strong> \u2014 to highlight the key differences:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea 1. gRPC Request (Over HTTP\/2 + Protobuf)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Summary:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uses HTTP\/2 as the transport<\/li>\n\n\n\n<li>Uses binary Protobuf messages<\/li>\n\n\n\n<li>Includes custom HTTP\/2 headers<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 gRPC HTTP\/2 Headers:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">:method: POST\n:scheme: https\n:authority: myservice.com\n:path: <span class=\"hljs-regexp\">\/greeter.Greeter\/<\/span>SayHello\ncontent-type: application\/grpc\n<span class=\"hljs-attr\">te<\/span>: trailers\ngrpc-timeout: <span class=\"hljs-number\">5<\/span>S\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 Binary Protobuf Payload (Encoded):<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">00000000120a0452616a657368120a48656c6c6f2c2052616a65736821\n<\/code><\/span><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u26a0\ufe0f Note: This payload is <strong>not human-readable<\/strong>. It\u2019s a binary encoding of:<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">message HelloRequest {\n  string name = <span class=\"hljs-string\">\"Rajesh\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea 2. REST Request (Over HTTP\/1.1 + JSON)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Summary:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uses HTTP\/1.1<\/li>\n\n\n\n<li>JSON payload<\/li>\n\n\n\n<li>Simple headers<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 HTTP\/1.1 Headers:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-keyword\">POST<\/span> <span class=\"hljs-string\">\/api\/hello<\/span> HTTP\/1.1\n<span class=\"hljs-attribute\">Host<\/span>: myservice.com\n<span class=\"hljs-attribute\">Content-Type<\/span>: application\/json\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 JSON Body:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Rajesh\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2705 Human-readable and easily debuggable.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea 3. GraphQL Request (Over HTTP\/1.1 + JSON)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Summary:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sends a query\/mutation in the body<\/li>\n\n\n\n<li>Still over HTTP\/1.1<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 Headers:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-keyword\">POST<\/span> <span class=\"hljs-string\">\/graphql<\/span> HTTP\/1.1\n<span class=\"hljs-attribute\">Content-Type<\/span>: application\/json\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 JSON Body:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"query\"<\/span>: <span class=\"hljs-string\">\"query SayHello($name: String!) { sayHello(name: $name) }\"<\/span>,\n  <span class=\"hljs-attr\">\"variables\"<\/span>: { <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Rajesh\"<\/span> }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea 4. WebSocket Message (Example Payload)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Summary:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bi-directional persistent connection<\/li>\n\n\n\n<li>Custom or JSON-encoded data<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd38 JSON Message:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"action\"<\/span>: <span class=\"hljs-string\">\"sayHello\"<\/span>,\n  <span class=\"hljs-attr\">\"data\"<\/span>: {\n    <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Rajesh\"<\/span>\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Key Differences<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>gRPC<\/th><th>REST<\/th><th>GraphQL<\/th><th>WebSocket<\/th><\/tr><\/thead><tbody><tr><td>Transport<\/td><td>HTTP\/2<\/td><td>HTTP\/1.1<\/td><td>HTTP\/1.1<\/td><td>WebSocket (TCP)<\/td><\/tr><tr><td>Encoding<\/td><td>Protobuf (binary)<\/td><td>JSON<\/td><td>JSON<\/td><td>JSON \/ Custom<\/td><\/tr><tr><td>Readability<\/td><td>\u274c Not human-readable<\/td><td>\u2705 Yes<\/td><td>\u2705 Yes<\/td><td>\u2705 Yes (usually JSON)<\/td><\/tr><tr><td>Schema Enforcement<\/td><td>\u2705 Yes (Protobuf contracts)<\/td><td>\u274c No<\/td><td>\u2705 Yes (GraphQL schema)<\/td><td>\u274c Custom per app<\/td><\/tr><tr><td>Streaming<\/td><td>\u2705 Native support<\/td><td>\u274c No<\/td><td>\ud83d\udeab Only with extra libs<\/td><td>\u2705 Native support<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0d How to Inspect gRPC Requests<\/h2>\n\n\n\n<p>Since gRPC requests are binary:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <strong><code>grpcurl<\/code><\/strong> to simulate or inspect requests<\/li>\n\n\n\n<li>Use <strong><code>BloomRPC<\/code><\/strong> or <strong>Postman (gRPC beta)<\/strong> to explore APIs<\/li>\n\n\n\n<li>Add interceptors to <strong>log decoded messages<\/strong> in dev<\/li>\n<\/ul>\n\n\n\n<p>Example with <code>grpcurl<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">grpcurl -plaintext localhost:<span class=\"hljs-number\">50051<\/span> <span class=\"hljs-keyword\">list<\/span>\ngrpcurl -d <span class=\"hljs-string\">'{\"name\": \"Rajesh\"}'<\/span> -plaintext localhost:<span class=\"hljs-number\">50051<\/span> greeter.Greeter\/SayHello\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>That&#8217;s a great question. The reason it&#8217;s hard to visually spot the difference in a gRPC request is because it&#8217;s a binary protocol over HTTP\/2, unlike human-readable formats like REST&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49371","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49371"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49371\/revisions"}],"predecessor-version":[{"id":58977,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49371\/revisions\/58977"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}