<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Swagger &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/swagger/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Wed, 07 Feb 2018 08:17:48 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Swagger &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>สร้าง API Document กับ .NET Core ง่ายๆ ด้วย  Swagger</title>
		<link>https://myifew.com/4376/generate-api-document-dotnet-core-with-swagger/</link>
					<comments>https://myifew.com/4376/generate-api-document-dotnet-core-with-swagger/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Tue, 06 Feb 2018 17:06:14 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[API Document]]></category>
		<category><![CDATA[Swagger]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4376</guid>

					<description><![CDATA[เมื่อโปรแกรเมอร์เขียน API เสร็จ และส่งให้ทีมอื่นๆไปใช้งานต่อ จะต้องอธิบายวิธีการใช้งานด้วย แต่ที่ต้องทำ คือควรมีเอกสารการใช้งาน หรือเรียกว่า API Document ส่งให้กับผู้ใช้เสมอๆ หรือเก็บไว้อ้างอิงที่ใดที่หนึ่ง

แต่กระนั้น โปรแกรมเมอร์อย่างเรามักไม่ชอบทำ API Document หรอกครับ เขียนๆไปแค่ให้มี สิ่งที่ได้มักเป็นเอกสารที่ใช้งานได้บ้างไม่ได้บ้าง เพราะเป็นภาษาที่คนเขียนเข้าใจแค่ตัวเอง หรือตัวอย่างไม่ชัดเจน หรือมีข้อมูลใช้งานไม่ครบถ้วน หนักไปกว่านั้นคือ บ่นว่าไม่มีเวลา แล้วก็ไม่ทำมันซะเลย (แต่มีเวลาไปอธิบายให้ผู้ใช้ทีละคนๆ 555)

ดังนั้น จะดีกว่าไหม ถ้าเราเขียนโค้ด API เสร็จ แล้วมีเครื่องมือสร้าง API Document ให้เราได้เลยอัตโนมัติ, อ่ะ ตอบแทนละกัน "ดีว่ะ!"]]></description>
										<content:encoded><![CDATA[<p>เมื่อโปรแกรเมอร์เขียน API เสร็จ และส่งให้ทีมอื่นๆไปใช้งานต่อ จะต้องอธิบายวิธีการใช้งานด้วย แต่ที่ต้องทำ คือควรมีเอกสารการใช้งาน หรือเรียกว่า API Document ส่งให้กับผู้ใช้เสมอๆ หรือเก็บไว้อ้างอิงที่ใดที่หนึ่ง</p>
<p>แต่กระนั้น โปรแกรมเมอร์อย่างเรามักไม่ชอบทำ API Document หรอกครับ เขียนๆไปแค่ให้มี สิ่งที่ได้มักเป็นเอกสารที่ใช้งานได้บ้างไม่ได้บ้าง เพราะเป็นภาษาที่คนเขียนเข้าใจแค่ตัวเอง หรือตัวอย่างไม่ชัดเจน หรือมีข้อมูลใช้งานไม่ครบถ้วน หนักไปกว่านั้นคือ บ่นว่าไม่มีเวลา แล้วก็ไม่ทำมันซะเลย (แต่มีเวลาไปอธิบายให้ผู้ใช้ทีละคนๆ 555)</p>
<p>ดังนั้น จะดีกว่าไหม ถ้าเราเขียนโค้ด API เสร็จ แล้วมีเครื่องมือสร้าง API Document ให้เราได้เลยอัตโนมัติ, อ่ะ ตอบแทนละกัน &#8220;ดีว่ะ!&#8221;<span id="more-4376"></span></p>
<p>เครื่องมือหนึ่งที่ผมจะแนะนำในบล็อกนี้ ชื่อว่า Swagger ซึ่งมันสามารถสร้างเอกสารการใช้งาน API (API Document) และเครื่องมือทดสอบให้เราได้ในทันที (Testing Tools) โดยมันจะแปลงจากคำสั่งในโค้ดของเราออกมาให้นั่นเอง</p>
<p>ในบล็อกนี้ผมลองใช้ Swagger กับ .NET Core 2 นะครับ สำหรับภาษาอื่นๆ สามารถหาข้อมูลเพิ่มเติมได้ที่ <a href="https://swagger.io/open-source-integrations/" target="_blank" rel="noopener">Swagger Open Source Integrations</a></p>
<p>ว่าแล้ว เรามาเริ่มทำตามขั้นตอนกันเลย</p>
<h2>ติดตั้ง NuGet packages</h2>
<p>ให้เราเข้าไปที่โฟลเดอร์ของ API เราก่อน และพิมพ์คำสั่ง add package ดังนี้</p>
<p>[code lang=&#8221;shell&#8221;]dotnet add api.csproj package Swashbuckle.AspNetCore[/code]</p>
<h2>ติดตั้ง Configure Swagger ใน Middleware</h2>
<p>เพิ่มโค้ดเข้าไปใน ConfigureServices() ของไฟล์ Startup.cs ดังนี้</p>
<p>[code lang=&#8221;csharp&#8221;]<br />
            services.AddSwaggerGen(c =&gt;<br />
            {<br />
                c.SwaggerDoc(&quot;v1&quot;, new Info { Title = &quot;My API&quot;, Version = &quot;v1&quot; });</p>
<p>                var basePath = AppContext.BaseDirectory;<br />
                var xmlPath = Path.Combine(basePath, &quot;MyApi.xml&quot;);<br />
                c.IncludeXmlComments(xmlPath);<br />
            });<br />
[/code]</p>
<p>จากนั้นให้ใส่ using package ไว้ด้วย (โดยปกติ Editor จะเตือนให้เพิ่มด้วย) ดังนี้</p>
<p>[code lang=&#8221;csharp&#8221;]using Swashbuckle.AspNetCore.Swagger;[/code]</p>
<p>จะได้ดังภาพนี้</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-large wp-image-4397" src="https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-1200x539.png" alt="" width="1024" height="460" srcset="https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-1200x539.png 1200w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-600x269.png 600w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-1024x460.png 1024w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-768x345.png 768w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice-700x314.png 700w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configurationservice.png 1822w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>ซึ่ง Title คือชื่อของหน้าเอกสาร ในที่นี้ผมใช้ชื่อ &#8220;My API&#8221; ส่วนกลุ่มบรรทัดล่างเป็นการขอเปิดใช้งาน Customize ข้อความในรูปแบบของเราเอง ด้วยการระบุข้อมูลเป็น Comment ลงไปในโค้ด (และ Swagger จะทำการเก็บข้อความเหล่านั้นตามไฟล์ XML ที่เราระบุไว้)</p>
<p>จากนั้น เพิ่มโค้ดเข้าไปใน Configure() ของไฟล์ Startup.cs ดังนี้</p>
<p>[code lang=&#8221;csharp&#8221;]<br />
            app.UseSwagger();<br />
            app.UseSwaggerUI(c =&gt;<br />
            {<br />
                c.SwaggerEndpoint(&quot;/swagger/v1/swagger.json&quot;, &quot;My API V1&quot;);<br />
            });<br />
[/code]</p>
<p>จะได้ดังภาพนี้</p>
<p><img decoding="async" class="alignnone size-large wp-image-4396" src="https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-1200x590.png" alt="" width="1024" height="503" srcset="https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-1200x590.png 1200w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-600x295.png 600w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-1024x504.png 1024w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-768x378.png 768w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration-700x344.png 700w, https://myifew.com/wp-content/uploads/2018/02/add-swagger-to-configuration.png 1638w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>เป็นอันเสร็จ ให้ทำการ build และ run ใหม่อีกครั้ง เพื่อลองใช้งาน</p>
<h2>ทดลองใช้งาน Swagger</h2>
<p>ให้เราเปิด browser เข้าไปที่ (แก้ url/port ตามที่คุณตั้งไว้ด้วยนะ)</p>
<blockquote><p>http://&lt;localhost:port&gt;/swagger/v1/swagger.json</p></blockquote>
<p>จะเจอข้อความ JSON ที่เป็นชุดคำสั่งของ Swagger</p>
<p><img decoding="async" class="alignnone size-large wp-image-4399" src="https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-1200x442.png" alt="" width="1024" height="377" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-1200x442.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-600x221.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-1024x377.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-768x283.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw-700x258.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-json-raw.png 2870w" sizes="(max-width: 1024px) 100vw, 1024px" /></p>
<p>แต่ถ้าต้องการดูสวยงามด้วย Swagger UI ให้เข้าไปที่</p>
<blockquote><p>http://&lt;localhost:port&gt;/swagger/</p></blockquote>
<p>จะได้หน้าตาสวยงามแบบนี้ครับ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4403" src="https://myifew.com/wp-content/uploads/2018/02/swagger-ui-1200x715.png" alt="" width="1024" height="610" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-ui-1200x715.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-600x358.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-1024x611.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-768x458.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-700x417.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui.png 2858w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>มันจะแสดงรายการ API ของเราออกมาทั้งหมด ตาม Controller/Method/Route ที่เราได้เขียนไปในโค้ดเลยครับ<br />
และเมื่อเรากดเข้าไปดูในรายละเอียดของแต่ละ API มันก็จะแสดงวิธีการ Access, Data Type, Respond Status, Respond Data, Respond Type ครบถ้วน ดังรูป</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4400" src="https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-1200x681.png" alt="" width="1024" height="581" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-1200x681.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-600x341.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-1024x581.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-768x436.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-700x397.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get.png 2872w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>หรืออีกตัวอย่างหนึ่ง ผมลองดึงข้อมูลสมาชิกหมายเลข 2 ออกมา ซึ่งในโค้ดผมบอกว่าต้องระบุ Parameter ให้ด้วย ดังนั้น ตัว Swagger มันก็ได้สร้าง Input ให้ผมได้กรอก Parameter นั้นให้อัตโนมัติเลย</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4401" src="https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-1200x685.png" alt="" width="1024" height="585" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-1200x685.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-600x342.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-1024x584.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-768x438.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter-700x399.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-get-with-parameter.png 2860w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>คราวนี้ลองมาดูการส่งข้อมูลแบบ HTTP Post บ้าง ซึ่งมันจะไปดึง Data Structure ของ Model ออกมาให้เราเป็นตัวอย่าง (ตามรูปด้านล่าง กล่องสีเหลืองด้านซ้าย) เมื่อกดที่ตัวอย่าง มันจะมากรอกให้ในช่อง Input ซ้ายมือ เราก็ทำการแก้ไขข้อมูลที่ต้องการใช้งาน ซึ่งในที่นี้ผมทดสอบการเพิ่มข้อมูลสมาชิก เมื่อกรอกเสร็จและกดปุ่ม &#8220;Tyr it out!&#8221; มันก็จะแสดงผลการทำงานออกมาให้เราดังรูปด้านล่าง</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4402" src="https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-892x1200.png" alt="" width="892" height="1200" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-892x1200.png 892w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-600x807.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-761x1024.png 761w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-768x1033.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data-520x700.png 520w, https://myifew.com/wp-content/uploads/2018/02/swagger-test-post-data.png 2038w" sizes="auto, (max-width: 892px) 100vw, 892px" /></p>
<h2>การ Customize Document</h2>
<p>ถ้าสังเกตดีๆ มี API ตัวหนึ่งที่มีข้อความโผล่มา ว่า &#8220;Get Member information from id&#8221; ซึ่งอันนี้ผมทำการ Customize เขียนเพิ่มคำอธิบายเข้าไป</p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4406" src="https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-1200x191.png" alt="" width="1024" height="163" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-1200x191.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-600x96.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-1024x163.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-768x122.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary-700x111.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-ui-summary.png 2028w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>ซึ่งในโค้ด API ที่เราต้องการอธิบายเพิ่มเติม ใส่แค่ /// (triple slash) และระบุ  tag &lt;summary&gt; พร้อมข้อความอธิบายสั้นๆว่า API นี้ทำอะไร (ตามภาพ) เท่านั้นเอง, ถ้าอยากยกตัวอย่างหรืออธิบายเพิ่ม สามารถใส่ &lt;remarks&gt; ได้ และยังมี tag อื่นๆ ที่คุณสามารถไปดูได้ที่ <a href="https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs=netcore-cli#customize--extend" target="_blank" rel="noopener">Customize &amp; extend</a></p>
<p><img loading="lazy" decoding="async" class="alignnone size-large wp-image-4405" src="https://myifew.com/wp-content/uploads/2018/02/swagger-comment-1200x364.png" alt="" width="1024" height="311" srcset="https://myifew.com/wp-content/uploads/2018/02/swagger-comment-1200x364.png 1200w, https://myifew.com/wp-content/uploads/2018/02/swagger-comment-600x182.png 600w, https://myifew.com/wp-content/uploads/2018/02/swagger-comment-1024x310.png 1024w, https://myifew.com/wp-content/uploads/2018/02/swagger-comment-768x233.png 768w, https://myifew.com/wp-content/uploads/2018/02/swagger-comment-700x212.png 700w, https://myifew.com/wp-content/uploads/2018/02/swagger-comment.png 1624w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>สรุป</h2>
<p>Swagger เป็นเครื่องมืออำนวยความสะดวกในการสร้าง API Document เพื่อลดเวลาการเขียนเอง แต่ทั้งนี้ มีเรื่องของ Security ที่ต้องป้องกันไม่ให้คนอื่นเข้ามาได้ หรือให้ดูได้เฉพาะ Development Environment เท่านั้น รวมถึง ถ้าจะให้ Document สมบูรณ์ เราก็ควรต้องเขียนโค้ดให้ถูกต้องโดยเฉพาะเรื่องของการตั้งชื่อตัวแปร ชื่อฟังก์ชั่น โมเดล ฯลฯ เพราะข้อมูลใน Document จะอ่านง่ายแค่ไหน มันสะท้อนจากโค้ดของเรานั่นเอง</p>
<p>&nbsp;</p>
<p>—</p>
<p>Reference: <a href="“https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger”" target="“_blank”">Microsoft.com</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4376/generate-api-document-dotnet-core-with-swagger/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
