<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Vanzuita</title>
    <description>The latest articles on DEV Community by João Vanzuita (@converge).</description>
    <link>https://dev.to/converge</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F107991%2F9d6cc8d9-5f40-4db1-92e8-c1bf6abe2d99.jpg</url>
      <title>DEV Community: João Vanzuita</title>
      <link>https://dev.to/converge</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/converge"/>
    <language>en</language>
    <item>
      <title>Gerando Especificação OpenAPI com Go Lang e Swagger</title>
      <dc:creator>João Vanzuita</dc:creator>
      <pubDate>Mon, 24 May 2021 21:03:09 +0000</pubDate>
      <link>https://dev.to/converge/gerando-especificacao-openapi-com-go-lang-e-swagger-3273</link>
      <guid>https://dev.to/converge/gerando-especificacao-openapi-com-go-lang-e-swagger-3273</guid>
      <description>&lt;p&gt;OpenAPI é uma padrão de especificação de API, criado de maneira a facilitar o processo de desenvolvimento&lt;br&gt;
e o entendimento do que a API realiza, de uma maneira simples em que programadores e utilizadores&lt;br&gt;
da API possam ler, utilizar e experimentar o seu funcionamento de forma simples e rápida.&lt;/p&gt;

&lt;p&gt;O Http Swagger é um wrapper para automatizar a geração de especificação de API utilizando Swagger&lt;br&gt;
versão 2.0.&lt;/p&gt;
&lt;h2&gt;
  
  
  Os principais PROs gerando a documentação da API dessa forma são:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;approach documentação como código.&lt;/li&gt;
&lt;li&gt;a documentação fica próxima da função que a utiliza, qualquer dúvida ou atualização, o que precisa
ser consultado e atualizado estão próximos.&lt;/li&gt;
&lt;li&gt;Em Go Lang, se algo está errado, o código não compila. Em outras palavras, se a definição da API
estiver errada, eu logo noto e posso rapidamente corrigi-la.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Mão na massa!
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. O primeiro passo é iniciar o projeto:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;seu-projecto
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;
go mod init github.com/&amp;lt;seu-user&amp;gt;/seu-projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Inicie a API básica
&lt;/h3&gt;

&lt;p&gt;Nesse exemplo crio duas funções, um endpoint GET e outro POST.&lt;/p&gt;
&lt;h4&gt;
  
  
  2.1 Endpoint básico para mostrar a versão da sua API
&lt;/h4&gt;

&lt;p&gt;Utilizo o &lt;a href="https://github.com/go-chi/chi"&gt;router Chi&lt;/a&gt;, porque preciso definir os verbos GET e POST &lt;br&gt;
no router, e não somente verificar o verbo na função. Por exemplo, tenho um endpoint fictício [GET] &lt;code&gt;/teste&lt;/code&gt;, neste endpoint definimos a especificacão&lt;br&gt;
OpenAPI para este endpoint, quando quero um verbo [POST] para a mesma entidade, eu preciso de um&lt;br&gt;
router p/ definir qual função é responsável pelo [GET] e qual função é responsável pelo [POST],&lt;br&gt;
vou mostrar isso, na prática, um pouco mais a frente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;chi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"API listening at port 3001..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":3001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;P/ informar a minha API que uma especificação OpenAPI será criada, preciso criamos um endpoint chamado&lt;br&gt;
&lt;code&gt;/swagger&lt;/code&gt;, e definimos a espcificacão inicial. Neste endpoint &lt;code&gt;/swagger&lt;/code&gt; a documentação auto gerada&lt;br&gt;
estará disponível usando a UI do Swagger. P/ isso defino este endpoint na API da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/swagger/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpSwagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WrapHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E adiciono a especificação OpenAPI p/ a função main, que ficará:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// @title Titulo da sua API&lt;/span&gt;
&lt;span class="c"&gt;// @version 1.0&lt;/span&gt;
&lt;span class="c"&gt;// @description Descricão longa da sua API&lt;/span&gt;
&lt;span class="c"&gt;// @termsOfService http://swagger.io/terms/&lt;/span&gt;
&lt;span class="c"&gt;// @license.name Apache 2.0&lt;/span&gt;
&lt;span class="c"&gt;// @license.url http://www.apache.org/licenses/LICENSE-2.0.html&lt;/span&gt;
&lt;span class="c"&gt;// @host localhost:3001&lt;/span&gt;
&lt;span class="c"&gt;// @BasePath /&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;chi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/swagger/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;httpSwagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WrapHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"API listening at port 3001..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":3001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora defino o exemplo p/ o endpoint &lt;code&gt;[GET] /&lt;/code&gt; sem a especificação OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"version: 1.0.0"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E em seguida defino a especificacão OpenAPI da seguinte forma p/ este endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// version godoc&lt;/span&gt;
&lt;span class="c"&gt;// @Summary Get API version&lt;/span&gt;
&lt;span class="c"&gt;// @Description Get API version&lt;/span&gt;
&lt;span class="c"&gt;// @Tags version&lt;/span&gt;
&lt;span class="c"&gt;// @Accept  json&lt;/span&gt;
&lt;span class="c"&gt;// @Produce  json&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} string&lt;/span&gt;
&lt;span class="c"&gt;// @Router / [get]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.2 Adicionando os imports necessários
&lt;/h4&gt;

&lt;p&gt;O primeiro import é importante p/ informar onde a minha definição da API está localizada, em seguida&lt;br&gt;
importo o router e o http-swagger que é responsável em ler os comentários e transformar em&lt;br&gt;
especificação no formato OpenAPI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Primeiro instalo a biblioteca Chi:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/go-chi/chi/v5
go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/swaggo/swag/cmd/swag
go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/swaggo/http-swagger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;E adiciono os importes:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"github.com/converge/strave-stories/docs"&lt;/span&gt; &lt;span class="c"&gt;// docs is generated by Swag CLI, you have to import it.&lt;/span&gt;
&lt;span class="s"&gt;"github.com/go-chi/chi/v5"&lt;/span&gt;
&lt;span class="n"&gt;httpSwagger&lt;/span&gt; &lt;span class="s"&gt;"github.com/swaggo/http-swagger"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Utilizando a ferramenta Swag p/ fazer o parser e gerar a especificação OpenAPI
&lt;/h4&gt;

&lt;p&gt;Neste ponto já posso chamar o &lt;code&gt;Swag&lt;/code&gt;, que criará os arquivos necessários, p/ posteriormente&lt;br&gt;
chamarmos o Swagger UI, que é a página web que mostra a documentação que especificamos nos&lt;br&gt;
comentários das funções, e também inicio a API para que a página fique exposta na API.&lt;/p&gt;

&lt;p&gt;Então novamente, os passos p/ gerar a documentão e iniciar o Swagger UI são:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;swag init
go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora é possível access o Swagger UI através do endereço &lt;a href="http://localhost:3001/swagger/"&gt;http://localhost:3001/swagger/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando endpoint /my-bike para o verbo [GET]
&lt;/h3&gt;

&lt;p&gt;É tão claro e fácil, que agora somente lendo o código é possível identificar como gerar documentação&lt;br&gt;
através dos comentários funciona, e como a OpenAPI é simples e gostosa de trabalhar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// listMyBike&lt;/span&gt;
&lt;span class="c"&gt;// @Summary List My Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Description List details of My Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Tags listMyBike&lt;/span&gt;
&lt;span class="c"&gt;// @Accept json&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @Success 200 {object} Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Router /my-bike [GET]&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;listMyBike&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myBike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adicionando endpoint /my-bike para o verbo [POST]
&lt;/h3&gt;

&lt;p&gt;Seguindo a ideia anterior, esta é a definição p/ o método POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// createMyBike&lt;/span&gt;
&lt;span class="c"&gt;// @Summary Create a Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Description Create a Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Tags createMyBike&lt;/span&gt;
&lt;span class="c"&gt;// @Accept json&lt;/span&gt;
&lt;span class="c"&gt;// @Produce json&lt;/span&gt;
&lt;span class="c"&gt;// @param body body Bike true "Bike Object"&lt;/span&gt;
&lt;span class="c"&gt;// @Success 201 {object} Bike&lt;/span&gt;
&lt;span class="c"&gt;// @Router /my-bike [POST]&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;createMyBike&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;reqBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ioutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;myBike&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bike created!"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo completo e funcionando está disponível &lt;a href="https://github.com/converge/my-bike-api"&gt;aqui&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
