{"componentChunkName":"component---src-modules-datocms-post-page-page-tsx","path":"/posts/44","result":{"data":{"post":{"title":"英語？日本語？マイクロサービスのエラーメッセージは何語が良い？","author":{"name":"suin","images":{"r32":{"src":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&fm=png&h=32&mask=ellipse&w=32","srcSet":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1&fm=png&h=32&mask=ellipse&w=32 1x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1.5&fm=png&h=32&mask=ellipse&w=32 1.5x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=2&fm=png&h=32&mask=ellipse&w=32 2x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=3&fm=png&h=32&mask=ellipse&w=32 3x"},"r48":{"src":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&fm=png&h=48&mask=ellipse&w=48","srcSet":"https://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1&fm=png&h=48&mask=ellipse&w=48 1x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=1.5&fm=png&h=48&mask=ellipse&w=48 1.5x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=2&fm=png&h=48&mask=ellipse&w=48 2x,\nhttps://www.datocms-assets.com/29850/1591833290-avatar512.jpg?auto=format&dpr=3&fm=png&h=48&mask=ellipse&w=48 3x"}},"bio":"好き: TypeScript, DDD, OOP／#YYTypeScript の主催者／Qiita 4位／株式会社クラフトマンソフトウェア取締役／『実践ドメイン駆動設計』邦訳レビュア／#分報 考案者／Web自動テストShouldBeeを開発"},"date":"2015年10月14日","tags":["マイクロサービス","多言語","エラーメッセージ"],"category":"プログラミング","body":"<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/a2569169-1bbd-432c-ba00-db42e5eb50f3.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"1200\" alt=\"image.png (176.9 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/a2569169-1bbd-432c-ba00-db42e5eb50f3.png\"></a>\n<p data-sourcepos=\"3:1-4:126\">マイクロサービスがREST APIを提供するようなアーキテクチャを組んだ場合でも、<br>\nマイクロサービスで発生したエラーをエンドユーザに何らかの形を通知する必要があります。</p>\n<p data-sourcepos=\"6:1-8:66\">技術的なシステムエラーであれば詳しく通知しないこともありますが、<br>\n「購入しようとした商品がちょうど売り切れてしまって購入できなかった」といったようなドメインエラーは、<br>\n必要十分にユーザに知らせる必要が出てきます。</p>\n<p data-sourcepos=\"10:1-11:123\">特に、多言語対応・地域対応まで念頭におくと、翻訳もしなければなりません。<br>\nでは、翻訳の責務はマイクロサービスのサーバ・クライアントどちらにあるのでしょうか？</p>\n<a href=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/5607cb9d-f04e-4279-9f81-b37e0f6916b8.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img width=\"1200\" alt=\"2.png (70.0 kB)\" src=\"https://c16e-esa-io-public-files.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/15637/2020/05/28/18740/5607cb9d-f04e-4279-9f81-b37e0f6916b8.png\"></a>\n<p data-sourcepos=\"15:1-16:118\">正解はシステムによって様々だと思います。<br>\nここでは、システムが採用できそうな責務の分担パターンを5つ紹介したいと思います。</p>\n<ol data-sourcepos=\"18:1-23:0\">\n<li data-sourcepos=\"18:1-19:23\">モノリンガル<br>\n1.マルチリンガル</li>\n<li data-sourcepos=\"20:1-20:24\">セマンティック</li>\n<li data-sourcepos=\"21:1-21:36\">フォーマットメッセージ</li>\n<li data-sourcepos=\"22:1-23:0\">ハイブリッドレスポンス</li>\n</ol>\n<h1 data-sourcepos=\"24:1-24:23\" id=\"1-0-0\" name=\"1-0-0\">\n<a class=\"anchor\" id=\"1. モノリンガル\" name=\"1.%20%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB\" href=\"#1.%20%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB\" data-position=\"1-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"1. モノリンガル\"> &gt; 1. モノリンガル</span></a>1. モノリンガル</h1>\n<p data-sourcepos=\"26:1-26:126\">英語など特定の言語のメッセージしか返さないサービス。翻訳の責務はクライアントが負う。</p>\n<h2 data-sourcepos=\"28:1-28:21\" id=\"1-1-0\" name=\"1-1-0\">\n<a class=\"anchor\" id=\"リクエスト例\" name=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B\" href=\"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B\" data-position=\"1-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"リクエスト例\"> &gt; リクエスト例</span></a>リクエスト例</h2>\n<div class=\"code-block\" data-sourcepos=\"30:1-41:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"nf\">POST</span> <span class=\"nn\">/users</span> <span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span>\n<span class=\"na\">Host</span><span class=\"p\">:</span> <span class=\"s\">account.services.example.com</span>\n<span class=\"na\">Content-Length</span><span class=\"p\">:</span> <span class=\"s\">69</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=utf-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"email\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"foo@example.com\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"password\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"p@ssW0rd\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"43:1-43:21\" id=\"1-2-0\" name=\"1-2-0\">\n<a class=\"anchor\" id=\"レスポンス例\" name=\"%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B\" href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B\" data-position=\"1-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"レスポンス例\"> &gt; レスポンス例</span></a>レスポンス例</h2>\n<div class=\"code-block\" data-sourcepos=\"45:1-52:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span> <span class=\"m\">400</span> <span class=\"ne\">Bad Request</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=UTF-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"message\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Username is too short (minimum is 3 characters)\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"55:1-55:36\" id=\"1-3-0\" name=\"1-3-0\">\n<a class=\"anchor\" id=\"モノリンガルのメリット\" name=\"%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"1-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"モノリンガルのメリット\"> &gt; モノリンガルのメリット</span></a>モノリンガルのメリット</h2>\n<ul data-sourcepos=\"57:1-58:0\">\n<li data-sourcepos=\"57:1-58:0\">サーバは、翻訳が不必要</li>\n</ul>\n<h2 data-sourcepos=\"59:1-59:39\" id=\"1-4-0\" name=\"1-4-0\">\n<a class=\"anchor\" id=\"モノリンガルのデメリット\" name=\"%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"1-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"モノリンガルのデメリット\"> &gt; モノリンガルのデメリット</span></a>モノリンガルのデメリット</h2>\n<ul data-sourcepos=\"61:1-63:0\">\n<li data-sourcepos=\"61:1-61:41\">クライアントは、翻訳が必要</li>\n<li data-sourcepos=\"62:1-63:0\">クライアントは、自由な翻訳がしにくい(しようと思ったら、テキスト処理が必要)</li>\n</ul>\n<h1 data-sourcepos=\"64:1-64:26\" id=\"2-0-0\" name=\"2-0-0\">\n<a class=\"anchor\" id=\"2. マルチリンガル\" name=\"2.%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB\" href=\"#2.%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB\" data-position=\"2-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"2. マルチリンガル\"> &gt; 2. マルチリンガル</span></a>2. マルチリンガル</h1>\n<p data-sourcepos=\"66:1-68:84\">クライアントの<code>Accept-Language</code>にしたがって、言語を切り替えるサービス。<br>\n翻訳の責務はサーバが負う。<br>\n例えば、Facebook APIはユーザの言語設定を見て切り替えている。</p>\n<h2 data-sourcepos=\"70:1-70:21\" id=\"2-1-0\" name=\"2-1-0\">\n<a class=\"anchor\" id=\"リクエスト例-1\" name=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-1\" href=\"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-1\" data-position=\"2-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"リクエスト例\"> &gt; リクエスト例</span></a>リクエスト例</h2>\n<div class=\"code-block\" data-sourcepos=\"72:1-84:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"nf\">POST</span> <span class=\"nn\">/users</span> <span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span>\n<span class=\"na\">Host</span><span class=\"p\">:</span> <span class=\"s\">account.services.example.com</span>\n<span class=\"na\">Content-Length</span><span class=\"p\">:</span> <span class=\"s\">69</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=utf-8</span>\n<span class=\"na\">Accept-Language</span><span class=\"p\">:</span> <span class=\"s\">ja-JP,ja;q=0.9,en-US;q=0.7,en;q=0.5</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"email\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"foo@example.com\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"password\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"p@ssW0rd\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"86:1-86:21\" id=\"2-2-0\" name=\"2-2-0\">\n<a class=\"anchor\" id=\"レスポンス例-1\" name=\"%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-1\" href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-1\" data-position=\"2-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"レスポンス例\"> &gt; レスポンス例</span></a>レスポンス例</h2>\n<div class=\"code-block\" data-sourcepos=\"88:1-96:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span> <span class=\"m\">400</span> <span class=\"ne\">Bad Request</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=UTF-8</span>\n<span class=\"na\">Content-Language</span><span class=\"p\">:</span> <span class=\"s\">ja</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"message\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"ユーザ名が短すぎます。(最低3文字)\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"98:1-98:39\" id=\"2-3-0\" name=\"2-3-0\">\n<a class=\"anchor\" id=\"マルチリンガルのメリット\" name=\"%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"2-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"マルチリンガルのメリット\"> &gt; マルチリンガルのメリット</span></a>マルチリンガルのメリット</h2>\n<ul data-sourcepos=\"101:1-102:0\">\n<li data-sourcepos=\"101:1-102:0\">クライアントは、翻訳が不必要</li>\n</ul>\n<h2 data-sourcepos=\"103:1-103:42\" id=\"2-4-0\" name=\"2-4-0\">\n<a class=\"anchor\" id=\"マルチリンガルのデメリット\" name=\"%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"2-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"マルチリンガルのデメリット\"> &gt; マルチリンガルのデメリット</span></a>マルチリンガルのデメリット</h2>\n<ul data-sourcepos=\"105:1-108:0\">\n<li data-sourcepos=\"105:1-105:59\">サーバは、ネゴシエーションの実装が必要</li>\n<li data-sourcepos=\"106:1-106:86\">サーバは、クライアントの要請によって翻訳を増やす必要あり</li>\n<li data-sourcepos=\"107:1-108:0\">クライアントは、自由な翻訳がしにくい(しようと思ったら、テキスト処理が必要)</li>\n</ul>\n<h1 data-sourcepos=\"109:1-109:26\" id=\"3-0-0\" name=\"3-0-0\">\n<a class=\"anchor\" id=\"3. セマンティック\" name=\"3.%20%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF\" href=\"#3.%20%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF\" data-position=\"3-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"3. セマンティック\"> &gt; 3. セマンティック</span></a>3. セマンティック</h1>\n<p data-sourcepos=\"111:1-112:48\">特定の言語を返さず、エラーコードなど意味的なエラー情報のみを返すサービス。<br>\n翻訳の責務はクライアントが負う。</p>\n<h2 data-sourcepos=\"114:1-114:21\" id=\"3-1-0\" name=\"3-1-0\">\n<a class=\"anchor\" id=\"リクエスト例-2\" name=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-2\" href=\"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-2\" data-position=\"3-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"リクエスト例\"> &gt; リクエスト例</span></a>リクエスト例</h2>\n<div class=\"code-block\" data-sourcepos=\"116:1-127:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"nf\">POST</span> <span class=\"nn\">/users</span> <span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span>\n<span class=\"na\">Host</span><span class=\"p\">:</span> <span class=\"s\">account.services.example.com</span>\n<span class=\"na\">Content-Length</span><span class=\"p\">:</span> <span class=\"s\">69</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=utf-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"email\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"foo@example.com\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"password\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"p@ssW0rd\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"129:1-129:21\" id=\"3-2-0\" name=\"3-2-0\">\n<a class=\"anchor\" id=\"レスポンス例-2\" name=\"%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-2\" href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-2\" data-position=\"3-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"レスポンス例\"> &gt; レスポンス例</span></a>レスポンス例</h2>\n<div class=\"code-block\" data-sourcepos=\"131:1-141:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span> <span class=\"m\">400</span> <span class=\"ne\">Bad Request</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=UTF-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"code\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"username.too_short\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"values\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"nl\">\"minimum\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"3\"</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<p data-sourcepos=\"143:1-143:163\">クライアントは、<code>username.too_short</code> → 日本語「ユーザ名は{minimum}文字以下にしてください」といったマップを持っている。</p>\n<h2 data-sourcepos=\"145:1-145:39\" id=\"3-3-0\" name=\"3-3-0\">\n<a class=\"anchor\" id=\"セマンティックのメリット\" name=\"%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"3-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"セマンティックのメリット\"> &gt; セマンティックのメリット</span></a>セマンティックのメリット</h2>\n<ul data-sourcepos=\"147:1-149:0\">\n<li data-sourcepos=\"147:1-147:47\">サーバは、翻訳を持たなくていい</li>\n<li data-sourcepos=\"148:1-149:0\">クライアントは、自由な翻訳が可能</li>\n</ul>\n<h2 data-sourcepos=\"150:1-150:42\" id=\"3-4-0\" name=\"3-4-0\">\n<a class=\"anchor\" id=\"セマンティックのデメリット\" name=\"%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"3-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"セマンティックのデメリット\"> &gt; セマンティックのデメリット</span></a>セマンティックのデメリット</h2>\n<ul data-sourcepos=\"152:1-155:0\">\n<li data-sourcepos=\"152:1-152:62\">クライアントは、必ず翻訳を持つ必要がある</li>\n<li data-sourcepos=\"153:1-153:80\">クライアントは、翻訳のエンジンを実装しないとならない</li>\n<li data-sourcepos=\"154:1-155:0\">クライアントは、サーバがメッセージオブジェクトを追加したら、すぐに対応しないといけない</li>\n</ul>\n<h1 data-sourcepos=\"156:1-156:38\" id=\"4-0-0\" name=\"4-0-0\">\n<a class=\"anchor\" id=\"4. フォーマットメッセージ\" name=\"4.%20%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8\" href=\"#4.%20%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8\" data-position=\"4-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"4. フォーマットメッセージ\"> &gt; 4. フォーマットメッセージ</span></a>4. フォーマットメッセージ</h1>\n<p data-sourcepos=\"158:1-159:48\">モノリンガルと同じく英語など特定の言語のメッセージしか返さないが、テキスト処理を容易にした中間的なメッセージオブジェクトを返すサービス。<br>\n翻訳の責務はクライアントが負う。</p>\n<h2 data-sourcepos=\"161:1-161:21\" id=\"4-1-0\" name=\"4-1-0\">\n<a class=\"anchor\" id=\"リクエスト例-3\" name=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-3\" href=\"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-3\" data-position=\"4-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"リクエスト例\"> &gt; リクエスト例</span></a>リクエスト例</h2>\n<div class=\"code-block\" data-sourcepos=\"163:1-174:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"nf\">POST</span> <span class=\"nn\">/users</span> <span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span>\n<span class=\"na\">Host</span><span class=\"p\">:</span> <span class=\"s\">account.services.example.com</span>\n<span class=\"na\">Content-Length</span><span class=\"p\">:</span> <span class=\"s\">69</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=utf-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"email\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"foo@example.com\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"password\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"p@ssW0rd\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"176:1-176:21\" id=\"4-2-0\" name=\"4-2-0\">\n<a class=\"anchor\" id=\"レスポンス例-3\" name=\"%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-3\" href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-3\" data-position=\"4-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"レスポンス例\"> &gt; レスポンス例</span></a>レスポンス例</h2>\n<div class=\"code-block\" data-sourcepos=\"178:1-188:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span> <span class=\"m\">400</span> <span class=\"ne\">Bad Request</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=UTF-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"message\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Username is too short (minimum is {{minimum}} characters)\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"values\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"nl\">\"minimum\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"3\"</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"190:1-190:51\" id=\"4-3-0\" name=\"4-3-0\">\n<a class=\"anchor\" id=\"フォーマットメッセージのメリット\" name=\"%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"4-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"フォーマットメッセージのメリット\"> &gt; フォーマットメッセージのメリット</span></a>フォーマットメッセージのメリット</h2>\n<ul data-sourcepos=\"192:1-195:0\">\n<li data-sourcepos=\"192:1-192:35\">サーバは、翻訳が不必要</li>\n<li data-sourcepos=\"193:1-193:53\">クライアントは、翻訳に自由度がある</li>\n<li data-sourcepos=\"194:1-195:0\">クライアントは、翻訳がなくても英語(もしくはサービスデフォルトの言語)をフォーマットすることで出力できる</li>\n</ul>\n<h2 data-sourcepos=\"196:1-196:54\" id=\"4-4-0\" name=\"4-4-0\">\n<a class=\"anchor\" id=\"フォーマットメッセージのデメリット\" name=\"%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"4-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"フォーマットメッセージのデメリット\"> &gt; フォーマットメッセージのデメリット</span></a>フォーマットメッセージのデメリット</h2>\n<ul data-sourcepos=\"198:1-200:0\">\n<li data-sourcepos=\"198:1-198:41\">クライアントは、翻訳が必要</li>\n<li data-sourcepos=\"199:1-200:0\">クライアントは、翻訳のエンジンを実装しないとならない</li>\n</ul>\n<h1 data-sourcepos=\"201:1-201:38\" id=\"5-0-0\" name=\"5-0-0\">\n<a class=\"anchor\" id=\"5. ハイブリッドレスポンス\" name=\"5.%20%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9\" href=\"#5.%20%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9\" data-position=\"5-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"5. ハイブリッドレスポンス\"> &gt; 5. ハイブリッドレスポンス</span></a>5. ハイブリッドレスポンス</h1>\n<p data-sourcepos=\"203:1-204:219\">最終的な翻訳の責務はクライアントが負うが、<br>\n翻訳の自由度、翻訳をしないという選択の自由をクライアントに与えるサービス。モノリンガル・セマンティック・フォーマットメッセージを組み合わせたもの。</p>\n<h2 data-sourcepos=\"206:1-206:21\" id=\"5-1-0\" name=\"5-1-0\">\n<a class=\"anchor\" id=\"リクエスト例-4\" name=\"%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-4\" href=\"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-4\" data-position=\"5-1-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"リクエスト例\"> &gt; リクエスト例</span></a>リクエスト例</h2>\n<div class=\"code-block\" data-sourcepos=\"208:1-219:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"nf\">POST</span> <span class=\"nn\">/users</span> <span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span>\n<span class=\"na\">Host</span><span class=\"p\">:</span> <span class=\"s\">account.services.example.com</span>\n<span class=\"na\">Content-Length</span><span class=\"p\">:</span> <span class=\"s\">69</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=utf-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"email\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"foo@example.com\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"password\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"p@ssW0rd\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"221:1-221:21\" id=\"5-2-0\" name=\"5-2-0\">\n<a class=\"anchor\" id=\"レスポンス例-4\" name=\"%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-4\" href=\"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-4\" data-position=\"5-2-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"レスポンス例\"> &gt; レスポンス例</span></a>レスポンス例</h2>\n<div class=\"code-block\" data-sourcepos=\"223:1-235:3\">\n<div class=\"code-filename\">\n<i class=\"fa fa-file-code-o\"></i>http</div>\n<div class=\"highlight\"><pre class=\"highlight http\"><code><span class=\"k\">HTTP</span><span class=\"o\">/</span><span class=\"m\">1.1</span> <span class=\"m\">400</span> <span class=\"ne\">Bad Request</span>\n<span class=\"na\">Content-Type</span><span class=\"p\">:</span> <span class=\"s\">application/json; charset=UTF-8</span>\n\n<span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"nl\">\"code\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"username.too_short\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"message\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Username is too short (minimum is 3 characters)\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"format\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Username is too short (minimum is {{minimum}} characters)\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"nl\">\"values\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"nl\">\"minimum\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"3\"</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>\n</div>\n<h2 data-sourcepos=\"237:1-237:51\" id=\"5-3-0\" name=\"5-3-0\">\n<a class=\"anchor\" id=\"ハイブリッドレスポンスのメリット\" name=\"%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"5-3-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"ハイブリッドレスポンスのメリット\"> &gt; ハイブリッドレスポンスのメリット</span></a>ハイブリッドレスポンスのメリット</h2>\n<ul data-sourcepos=\"239:1-242:0\">\n<li data-sourcepos=\"239:1-239:35\">サーバは、翻訳が不必要</li>\n<li data-sourcepos=\"240:1-240:53\">クライアントは、翻訳に自由度がある</li>\n<li data-sourcepos=\"241:1-242:0\">クライアントは、翻訳がなくても英語(もしくはサービスデフォルトの言語)をそのまま出すことができる</li>\n</ul>\n<h2 data-sourcepos=\"243:1-243:54\" id=\"5-4-0\" name=\"5-4-0\">\n<a class=\"anchor\" id=\"ハイブリッドレスポンスのデメリット\" name=\"%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" href=\"#%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88\" data-position=\"5-4-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"ハイブリッドレスポンスのデメリット\"> &gt; ハイブリッドレスポンスのデメリット</span></a>ハイブリッドレスポンスのデメリット</h2>\n<ul data-sourcepos=\"245:1-249:0\">\n<li data-sourcepos=\"245:1-245:41\">クライアントは、翻訳が必要</li>\n<li data-sourcepos=\"246:1-246:80\">クライアントは、翻訳のエンジンを実装しないとならない</li>\n<li data-sourcepos=\"247:1-247:68\">クライアントは、翻訳の方法が複数できてしまう</li>\n<li data-sourcepos=\"248:1-249:0\">サーバは、3つのデータを作らないとならない</li>\n</ul>\n<h1 data-sourcepos=\"250:1-250:32\" id=\"6-0-0\" name=\"6-0-0\">\n<a class=\"anchor\" id=\"翻訳データプロバイダ\" name=\"%E7%BF%BB%E8%A8%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80\" href=\"#%E7%BF%BB%E8%A8%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80\" data-position=\"6-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"翻訳データプロバイダ\"> &gt; 翻訳データプロバイダ</span></a>翻訳データプロバイダ</h1>\n<p data-sourcepos=\"252:1-253:171\">セマンティックメッセージやフォーマットメッセージはクライアントが翻訳する必要があるというデメリットがある。<br>\n翻訳データプロバイダは、クライアントが翻訳エンジンを実装するコストを抑えるために、サーバが協力する補助的な仕組み。</p>\n<p data-sourcepos=\"255:1-257:81\">例えば、セマンティックの場合、サーバはエラーコードと翻訳のマップをHTTPで公開・提供する。<br>\nクライアントはHTTP経由でサーバの翻訳データリソースにアクセスし、ダウンロードでき、<br>\nその翻訳マップをデフォルトとして利用することができる。</p>\n<h1 data-sourcepos=\"259:1-259:11\" id=\"7-0-0\" name=\"7-0-0\">\n<a class=\"anchor\" id=\"まとめ\" name=\"%E3%81%BE%E3%81%A8%E3%82%81\" href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" data-position=\"7-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"まとめ\"> &gt; まとめ</span></a>まとめ</h1>\n<p data-sourcepos=\"261:1-261:165\">マイクロサービスでエラーメッセージの翻訳の責務をどうしたらいいかについて、いくつかパターンを整理してみました。</p>\n<p data-sourcepos=\"263:1-263:147\">どれが正解というわけではないので、プロジェクトやシステムに合ったものを採用するといいかと思います。</p>\n"}},"pageContext":{"id":"DatoCmsPost-5142981-ja","description":"マイクロサービスがREST APIを提供するようなアーキテクチャを組んだ場合でも、 マイクロサービスで発生したエラーをエンドユーザに何らかの形を通知する必要があります。 技術的なシステムエラーであれば詳しく通知しないこともありますが、 「購入しようとした商品がちょうど売り切れてしまって購入できなかった」といったようなドメインエラーは、 必要十分にユーザに知らせる必要が出てきます。 特に、多言語対応・地域対応まで念頭におくと、翻訳もしなければなりません。 では、翻訳の責務はマイクロサービスのサーバ・クライアントどちらにあるのでしょうか？ 正解はシステムによって様々だと思います。 ここでは、システ","toc":[{"tag":"h1","depth":1,"href":"#1.%20%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB","text":"1. モノリンガル","html":"1. モノリンガル"},{"tag":"h2","depth":2,"href":"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B","text":"リクエスト例","html":"リクエスト例"},{"tag":"h2","depth":2,"href":"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B","text":"レスポンス例","html":"レスポンス例"},{"tag":"h2","depth":2,"href":"#%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"モノリンガルのメリット","html":"モノリンガルのメリット"},{"tag":"h2","depth":2,"href":"#%E3%83%A2%E3%83%8E%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"モノリンガルのデメリット","html":"モノリンガルのデメリット"},{"tag":"h1","depth":1,"href":"#2.%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB","text":"2. マルチリンガル","html":"2. マルチリンガル"},{"tag":"h2","depth":2,"href":"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-1","text":"リクエスト例","html":"リクエスト例"},{"tag":"h2","depth":2,"href":"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-1","text":"レスポンス例","html":"レスポンス例"},{"tag":"h2","depth":2,"href":"#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"マルチリンガルのメリット","html":"マルチリンガルのメリット"},{"tag":"h2","depth":2,"href":"#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%AA%E3%83%B3%E3%82%AC%E3%83%AB%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"マルチリンガルのデメリット","html":"マルチリンガルのデメリット"},{"tag":"h1","depth":1,"href":"#3.%20%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF","text":"3. セマンティック","html":"3. セマンティック"},{"tag":"h2","depth":2,"href":"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-2","text":"リクエスト例","html":"リクエスト例"},{"tag":"h2","depth":2,"href":"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-2","text":"レスポンス例","html":"レスポンス例"},{"tag":"h2","depth":2,"href":"#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"セマンティックのメリット","html":"セマンティックのメリット"},{"tag":"h2","depth":2,"href":"#%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"セマンティックのデメリット","html":"セマンティックのデメリット"},{"tag":"h1","depth":1,"href":"#4.%20%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8","text":"4. フォーマットメッセージ","html":"4. フォーマットメッセージ"},{"tag":"h2","depth":2,"href":"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-3","text":"リクエスト例","html":"リクエスト例"},{"tag":"h2","depth":2,"href":"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-3","text":"レスポンス例","html":"レスポンス例"},{"tag":"h2","depth":2,"href":"#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"フォーマットメッセージのメリット","html":"フォーマットメッセージのメリット"},{"tag":"h2","depth":2,"href":"#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"フォーマットメッセージのデメリット","html":"フォーマットメッセージのデメリット"},{"tag":"h1","depth":1,"href":"#5.%20%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9","text":"5. ハイブリッドレスポンス","html":"5. ハイブリッドレスポンス"},{"tag":"h2","depth":2,"href":"#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E4%BE%8B-4","text":"リクエスト例","html":"リクエスト例"},{"tag":"h2","depth":2,"href":"#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E4%BE%8B-4","text":"レスポンス例","html":"レスポンス例"},{"tag":"h2","depth":2,"href":"#%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"ハイブリッドレスポンスのメリット","html":"ハイブリッドレスポンスのメリット"},{"tag":"h2","depth":2,"href":"#%E3%83%8F%E3%82%A4%E3%83%96%E3%83%AA%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88","text":"ハイブリッドレスポンスのデメリット","html":"ハイブリッドレスポンスのデメリット"},{"tag":"h1","depth":1,"href":"#%E7%BF%BB%E8%A8%B3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80","text":"翻訳データプロバイダ","html":"翻訳データプロバイダ"},{"tag":"h1","depth":1,"href":"#%E3%81%BE%E3%81%A8%E3%82%81","text":"まとめ","html":"まとめ"}],"ogpImageUrl":"https://www.datocms-assets.com/29850/1593190022-pastedimage20200627146.png?fm=png&mark64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9NDAwJmg9NjQmZml0PWNyb3AmYmxlbmQ2ND1hSFIwY0hNNkx5OTNkM2N1WkdGMGIyTnRjeTFoYzNObGRITXVZMjl0THpJNU9EVXdMekUxT1RFNE16TXlPVEF0WVhaaGRHRnlOVEV5TG1wd1p6OXRZWE5yUFdWc2JHbHdjMlVtWm0wOWNHNW5KbmM5TWpVMkptZzlNalUyJmJsZW5kLWg9NjQmYmxlbmQteD0wJmJsZW5kLXk9MCZibGVuZC1tb2RlPW5vcm1hbCZtYXJrNjQ9YUhSMGNITTZMeTloYzNObGRITXVhVzFuYVhndWJtVjBMMzUwWlhoMFAzUjRkQzFoYkdsbmJqMXRhV1JrYkdVbE1rTnNaV1owSm5SNGRDMW1iMjUwUFhOaGJuTXRjMlZ5YVdZbE1rTmliMnhrSm5SNGRDMWpiMnh2Y2oweU1qRTRNVFltZEhoME5qUTlZek5XY0dKbkpuUjRkQzF6YVhwbFBUTXdKbWc5TmpRJm1hcmsteD02NCZtYXJrLWFsaWduPW1pZGRsZSUyQ2xlZnQ&mark-align=bottom%2Cleft&mark-x=100&mark-y=496&blend64=aHR0cHM6Ly93d3cuZGF0b2Ntcy1hc3NldHMuY29tLzI5ODUwLzE1OTMxNTQ2MzYtdHJhbnNwYXJlbnQtcGl4ZWwucG5nP3c9MTIwMCZoPTYzMCZmaXQ9Y3JvcCZtYXJrNjQ9YUhSMGNITTZMeTkzZDNjdVpHRjBiMk50Y3kxaGMzTmxkSE11WTI5dEx6STVPRFV3THpFMU9UTXhOVEE1TkRBdFkzSmhablJ6YldGdUxUQXhMbkJ1WncmbWFyay1hbGlnbj10b3AlMkNjZW50ZXImbWFyay13PTI1MCZtYXJrLXk9ODAmYmxlbmQ2ND1hSFIwY0hNNkx5OWhjM05sZEhNdWFXMW5hWGd1Ym1WMEwzNTBaWGgwUDNSNGRDMWhiR2xuYmoxdGFXUmtiR1VsTWtOalpXNTBaWEltZEhoMExXWnZiblE5YzJGdWN5MXpaWEpwWmlVeVEySnZiR1FtZEhoMExYQmhaRDB4TURBbWRIaDBMV052Ykc5eVBUSXlNVGd4TmlaMGVIUTJORDAyU1hWNE5rdHhaVGMzZVdZMWNHVnNOWEI1Y3paTGNXVTNOM2xtTkRSUFpUUTBTMnMwTkV0Mk5EUlBkRFEwU3pFME5FODRORFJQVkRRMFN6VTBORWQxTkRSTGJ6UTBUM0EwTkU4NE5EUlBhRFEwVDBRME5FczNORFJQT0RRMFN6UTBORWQyTlV3eVZqWkxjV1UwTkVkTk5rbHRkalEwUjBVM04zbG1KblI0ZEMxemFYcGxQVFUxSm5jOU1USXdNQ1pvUFRZek1BJmJsZW5kLW1vZGU9bm9ybWFs&blend-mode=normal","otherPost":{"type":"author","title":"30分間React入門「いいねボタン」作成チュートリアル！","slug":"/posts/47"}}}}