{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/dredd-supports-swagger/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"e68a7d78-a192-5812-930a-41f2b9e13a67","excerpt":"以前に APIドキュメントでAPIサーバをテストする | WEB EGG という記事を書いたときに紹介したDreddですが、 いつのまにか自社サービスのApiaryだけでなくSwagger(OpenAPI v…","html":"<p>以前に</p>\n<blockquote>\n<p><a href=\"/post/how-to-test-api-server-with-api-spec/\">APIドキュメントでAPIサーバをテストする | WEB EGG</a></p>\n</blockquote>\n<p>という記事を書いたときに紹介した<a href=\"https://github.com/apiaryio/dredd\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Dredd</a>ですが、<br>\nいつのまにか自社サービスのApiaryだけでなくSwagger(OpenAPI v2)にも対応していたそうです。</p>\n<p>ついでにロゴも洗練されてかっこよくなってます。</p>\n<p>自分で書いた過去記事の末尾でも軽く触れていますが、<br>\nOpenAPI initiativeも未だ活動続いてますし、「乗るしか無い、このビッグウェーブに」といったところなんでしょうか。<br>\nなんにせよApiaryにロックインすることなく、Swaggerで記述した仕様書がテストできるようになったというのは嬉しいことなので早速試してみました。</p>\n<!--more-->\n<h2 id=\"dreddをインストール\" style=\"position:relative;\"><a href=\"#dredd%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\" aria-label=\"dreddをインストール permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dreddをインストール</h2>\n<p>READMEのとおりです。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install -g dredd</code></pre></div>\n<h2 id=\"swaggerのデモ仕様書を作成\" style=\"position:relative;\"><a href=\"#swagger%E3%81%AE%E3%83%87%E3%83%A2%E4%BB%95%E6%A7%98%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90\" aria-label=\"swaggerのデモ仕様書を作成 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Swaggerのデモ仕様書を作成</h2>\n<p>まずはミニマムで試してみたいので、ドキュメントにあるやつをそのままパクります。</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">swagger</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"2.0\"</span>\n<span class=\"token key atrule\">info</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"1.0\"</span>\n  <span class=\"token key atrule\">title</span><span class=\"token punctuation\">:</span> Example API\n  <span class=\"token key atrule\">license</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MIT\n<span class=\"token key atrule\">host</span><span class=\"token punctuation\">:</span> www.example.com\n<span class=\"token key atrule\">basePath</span><span class=\"token punctuation\">:</span> /\n<span class=\"token key atrule\">schemes</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> http\n<span class=\"token key atrule\">paths</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">/</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">get</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">produces</span><span class=\"token punctuation\">:</span>\n        <span class=\"token punctuation\">-</span> application/json; charset=utf<span class=\"token punctuation\">-</span><span class=\"token number\">8</span>\n      <span class=\"token key atrule\">responses</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">200</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"\"</span>\n          <span class=\"token key atrule\">schema</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> object\n            <span class=\"token key atrule\">properties</span><span class=\"token punctuation\">:</span>\n              <span class=\"token key atrule\">message</span><span class=\"token punctuation\">:</span>\n                <span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> string\n            <span class=\"token key atrule\">required</span><span class=\"token punctuation\">:</span>\n              <span class=\"token punctuation\">-</span> message</code></pre></div>\n<p>ちなみにOpenAPI v3(<a href=\"https://github.com/OAI/OpenAPI-Specification/tree/OpenAPI.next\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">OpenAPI.nextブランチ</a>)には対応してないのか調べてみたのですが、してないようでした。<br>\nまぁまだスキーマ定義もサンプル仕様も存在しないし仕方ないと思います。</p>\n<h2 id=\"デモアプリ作成\" style=\"position:relative;\"><a href=\"#%E3%83%87%E3%83%A2%E3%82%A2%E3%83%97%E3%83%AA%E4%BD%9C%E6%88%90\" aria-label=\"デモアプリ作成 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>デモアプリ作成</h2>\n<p>同じくドキュメントからパクります。</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> app <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'express'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">req<span class=\"token punctuation\">,</span> res</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  res<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>message<span class=\"token operator\">:</span> <span class=\"token string\">'Hello World!'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\napp<span class=\"token punctuation\">.</span><span class=\"token function\">listen</span><span class=\"token punctuation\">(</span><span class=\"token number\">3000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>ごく簡単なechoサーバです。</p>\n<h2 id=\"いざdredd実行\" style=\"position:relative;\"><a href=\"#%E3%81%84%E3%81%96dredd%E5%AE%9F%E8%A1%8C\" aria-label=\"いざdredd実行 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>いざDredd実行</h2>\n<p>ドキュメント</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ dredd swagger.yml localhost:3000\ninfo: Beginning Dredd testing...\npass: GET / duration: 56ms\ncomplete: 1 passing, 0 failing, 0 errors, 0 skipped, 1 total\ncomplete: Tests took 64ms</code></pre></div>\n<p>はい、いい感じです。さすがDredd。</p>\n<h2 id=\"aws-api-gatewayのデモapiを使ってみる\" style=\"position:relative;\"><a href=\"#aws-api-gateway%E3%81%AE%E3%83%87%E3%83%A2api%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B\" aria-label=\"aws api gatewayのデモapiを使ってみる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>AWS API GatewayのデモAPIを使ってみる</h2>\n<p>もうちょい実用向けのサンプルも欲しいところです。<br>\nSwaggerといえば、<a href=\"https://aws.amazon.com/jp/api-gateway/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">AWS API Gateway</a>でしょう。<br>\nAPI Gatewayはデフォルトで<a href=\"http://petstore.swagger.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">SwaggerのPetstore</a>というサンプル仕様書を作成してくれます。<br>\nということで、これもテストしてみます。</p>\n<ol>\n<li>AWSのコンソールでAPI Gatewayを有効化</li>\n<li>Petstore APIがデフォルトで入力されてるのでそのままインポート</li>\n<li>作ったAPIをデプロイ</li>\n<li>Swaggerの仕様書をエクスポート</li>\n</ol>\n<p>でAPIのエンドポイントとswaggerの仕様書を入手して、試してみます。<br>\nエクスポートした仕様書はYAML形式で<code>swagger.yml</code>というファイル名で保存しました。</p>\n<p><code>{XXXXXXXXXXX}</code>, <code>{STAGE}</code>は自分で入力した内容になります。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ dredd swagger.yml https://{XXXXXXXXXXX}.execute-api.ap-northeast-1.amazonaws.com/{STAGE}\nerror: Compilation error in file 'swagger.yml': Required URI parameter 'petId' has no example or default value. ( > /beta/pets/{petId} > GET)\nerror: Compilation error in file 'swagger.yml': Required URI parameter 'petId' has no example or default value. ( > /beta/pets/{petId} > OPTIONS)\nwarn: Compilation warning in file 'swagger.yml': Ambiguous URI parameter in template: /beta/pets/{petId}\nNo example value for required parameter in API description document: petId ( > /beta/pets/{petId} > GET)\nwarn: Compilation warning in file 'swagger.yml': Ambiguous URI parameter in template: /beta/pets/{petId}\nNo example value for required parameter in API description document: petId ( > /beta/pets/{petId} > OPTIONS)\nerror: Error when processing API description.</code></pre></div>\n<p>あら。エラーになってしまいました。<br>\nPetStoreの仕様書自体に問題があるようです。</p>\n<p>これを治すのは本筋じゃない感じがしたので、いったんここまでで止めておきます。<br>\nAPI GatewayとLambdaをベースにしたサーバレスなAPIサーバとかも、簡単に受け入れテストできるようになるので、便利だと思います。<br>\nDreddがApiary(API Blueprint)ではなくSwaggerに対応したことは大きな意味を持つと思います。</p>\n<p>尻切れトンボですみません。</p>","timeToRead":4,"frontmatter":{"title":"HTTP APIのテストツールDreddがSwaggerに対応していたので試してみた","tags":["API","AWS API Gateway","Dredd","OpenAPI","Swagger"],"date":"March 21, 2017","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='144'%20viewBox='0%200%20400%20144'%20preserveAspectRatio='none'%3e%3cpath%20d='M56%2040L39%2051l-1%2021c0%2020%200%2020%205%2023%202%202%203%203%203%208v13l3-3%204-2%201-4v-5l9%205c11%206%2011%206%2022%200l9-5v4c0%204%201%205%207%209l1-9c0-8%200-8%202-10%206-5%206-3%206-24l-1-20c0-2-33-21-35-21l-18%209m2%201l-15%209-3%202v19c0%2018%200%2020%202%2021%201%202%202%201%202-12V66l3-8c8-15%2018-21%2032-18%209%202%2015%206%2019%2015l5%209c1%201%202%2014%201%2022-1%207%201%209%203%205%202-3%201-37%200-39-2-3-32-19-34-19l-15%208m81%2010l1%207%204-1c5%200%208-2%208-6%200-5-3-7-8-7h-5v7m15%200c0%204%201%206%202%207l1-2c0-4%203-4%204%200l3%202v-3c-1-1-1-3%201-4%202-5%200-7-6-7h-5v7m26%200c0%208%201%208%208%206%208-3%205-13-4-13h-4v7m15%200v7h4c11-2%2011-14%200-14h-4v7M65%2053v4h9c9%200%209%200%209-2l1-4c0-2-1-2-10-2H64l1%204m0%2049l-5%201%206%203%208%204%2013-7c0-2-13-2-22-1'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.760330578512397,"src":"/static/9cad1bffef3544de1301b710dc364e06/8eab8/featured-image.png","srcSet":"/static/9cad1bffef3544de1301b710dc364e06/1ec58/featured-image.png 334w,\n/static/9cad1bffef3544de1301b710dc364e06/ccb4a/featured-image.png 668w,\n/static/9cad1bffef3544de1301b710dc364e06/8eab8/featured-image.png 1336w,\n/static/9cad1bffef3544de1301b710dc364e06/a3884/featured-image.png 1772w","srcWebp":"/static/9cad1bffef3544de1301b710dc364e06/f7e47/featured-image.webp","srcSetWebp":"/static/9cad1bffef3544de1301b710dc364e06/cd98f/featured-image.webp 334w,\n/static/9cad1bffef3544de1301b710dc364e06/7535d/featured-image.webp 668w,\n/static/9cad1bffef3544de1301b710dc364e06/f7e47/featured-image.webp 1336w,\n/static/9cad1bffef3544de1301b710dc364e06/edb99/featured-image.webp 1772w","sizes":"(max-width: 1336px) 100vw, 1336px"}}}}}},"pageContext":{"slug":"/dredd-supports-swagger/","previous":{"fields":{"slug":"/dockerize-friends-lang/"},"frontmatter":{"title":"すごーい！きみはフレンズ言語をDockerizeできるフレンズなんだね！","tags":["Docker","F#","Github","Mac"]}},"next":{"fields":{"slug":"/introduction-of-raspberry-pi-with-gui/"},"frontmatter":{"title":"Raspberry pi 3 Model BでGUIを起動してインターネットに繋がるまでの手順","tags":["RaspberryPi"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}