<?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>gorilla/mux | www.valeriofinazzo.it</title>
	<atom:link href="http://www.valeriofinazzo.it/wordpress/tag/gorilla-mux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.valeriofinazzo.it/wordpress</link>
	<description>Il sito dell&#039;ingegnere Valerio Finazzo</description>
	<lastBuildDate>Fri, 30 Oct 2020 16:39:52 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.3</generator>
	<item>
		<title>TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</title>
		<link>http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 13 Sep 2020 15:46:23 +0000</pubDate>
				<category><![CDATA[GOLANG]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[gorilla/mux]]></category>
		<guid isPermaLink="false">http://www.valeriofinazzo.it/wordpress/?p=633</guid>

					<description><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e &#8230; <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" class="more-link">Continua la lettura di <span class="screen-reader-text">TUTORIAL GO &#8211; IMPLEMENTARE DEI SERVIZI HTTP</span> <span class="meta-nav">&#8594;</span></a></p>
The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></description>
										<content:encoded><![CDATA[<p>Nell&#8217;articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package &#8220;net/http&#8221; e &#8220;encoding/json&#8221;, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e decoding di oggetti json.</p>



<p>Incominciamo instanziando il server e implementando un servizio di keepalive che serve a stabilire se il server è attivo regolarmente.</p>



<pre class="crayon-plain-tag">http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))</pre>



<p>La funzione HandleFunc definisce il path e il relativo handler. Per handler si intende la funzione che verrà eseguita dal server in corrispondenza della richiesta riceveuta.</p>



<pre class="crayon-plain-tag">func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}</pre>



<p>Se abbiamo fatto tutto bene invocando il servizio http://localhost:10000/isAlive riceveremo un 200 ok con testo alive.</p>



<p>A questo punto supponiamo di voler gestire una rubrica dei contatti e pertanto definiamo prima di tutto la nostra struct Contatto</p>



<pre class="crayon-plain-tag">type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}</pre>



<p>La struct presenta 2 parametri Nome e Cognome e relative regole di trascodifica in json. Definiamo l&#8217;elenco dei contatti e lo inizializziamo con dei dati di prova, simulando la presenza di un database</p>



<pre class="crayon-plain-tag">var contatti []contatto
func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}</pre>



<p>Infine definiamo l&#8217;handler relativo</p>



<pre class="crayon-plain-tag">func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func main() {
        http.HandleFunc(&quot;/contatti&quot;, elencoContatti)
}</pre>



<p>In tal modo invocando l&#8217;url http://localhost:10000/contatti otterremo il seguente json [{&#8220;Nome&#8221;:&#8221;nome 1&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 1&#8243;},{&#8220;Nome&#8221;:&#8221;nome 2&#8243;,&#8221;Cognome&#8221;:&#8221;Cognome 2&#8243;}]</p>



<p>Di seguito il codice completo </p>



<pre class="crayon-plain-tag">package main

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, nil))
}</pre>



<p>Il package http ci ha consentito di tirare su il server e configurare delle risposte su dei path statici. Il package ha dei limiti, non ci permette di configurare degli endpoint variabili ed esplicitare il metodo http supportato. Per superare questo limite ci viene in soccorso un nuovo package   &#8220;github.com/gorilla/mux&#8221;. Il package va installato con il comando </p>



<pre class="crayon-plain-tag">go get -u github.com/gorilla/mux</pre>



<p>A questo per tirare su il server e configurare opportunamente gli endpoint possiamo scrivere</p>



<pre class="crayon-plain-tag">myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))</pre>



<p>Il packge ci mette a disposizione l&#8217;oggetto router che consente per ogni  handler di definire maggiori proprietà per meglio mappare il comportamento</p>



<pre class="crayon-plain-tag">func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}</pre>



<p>Il package ci consente agevolmente di leggere le path variable e superare i limiti del package net/http.</p>



<p>Di seguito il codice completo per l&#8217;analisi dei metodi restanti</p>



<pre class="crayon-plain-tag">package main

import (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;log&quot;
	&quot;net/http&quot;
	&quot;strconv&quot;

	&quot;github.com/gorilla/mux&quot;
)

type contatto struct {
	Nome    string `json:&quot;Nome&quot;`
	Cognome string `json:&quot;Cognome&quot;`
}

func isAlive(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, &quot;alive&quot;)
}

func elencoContatti(response http.ResponseWriter, request *http.Request) {
	json.NewEncoder(response).Encode(contatti)
}

func creaContatto(response http.ResponseWriter, request *http.Request) {
	var contatto contatto
	json.NewDecoder(request.Body).Decode(&amp;amp;contatto)
	contatti = append(contatti, contatto)
	json.NewEncoder(response).Encode(contatti)
}

func singoloContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index, contatto := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			json.NewEncoder(response).Encode(contatto)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

func eliminaContatto(response http.ResponseWriter, request *http.Request) {
	vars := mux.Vars(request)
	key := vars[&quot;id&quot;]
	for index := range contatti {
		fmt.Println(index, &quot; &quot;, key)
		i, _ := strconv.Atoi(key)
		if index == i {
			contatti = append(contatti[:index], contatti[index+1:]...)
			response.WriteHeader(http.StatusOK)
			return
		}
	}
	response.WriteHeader(http.StatusNotFound)
}

var contatti []contatto

func main() {

	contatti = []contatto{
		contatto{Nome: &quot;nome 1&quot;, Cognome: &quot;Cognome 1&quot;},
		contatto{Nome: &quot;nome 2&quot;, Cognome: &quot;Cognome 2&quot;},
	}

	fmt.Println(&quot;Http server up &quot;)
	//http.HandleFunc(&quot;/isAlive&quot;, isAlive)
	//http.HandleFunc(&quot;/contatti&quot;, elencoContatti)

	myRouter := mux.NewRouter().StrictSlash(true)
	myRouter.HandleFunc(&quot;/isAlive&quot;, isAlive).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, elencoContatti).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, singoloContatto).Methods(&quot;GET&quot;)
	myRouter.HandleFunc(&quot;/contatti&quot;, creaContatto).Methods(&quot;POST&quot;)
	myRouter.HandleFunc(&quot;/contatti/{id}&quot;, eliminaContatto).Methods(&quot;DELETE&quot;)
	log.Fatal(http.ListenAndServe(&quot;:10000&quot;, myRouter))
}</pre>



<p>Alla prossima</p>
<p><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_google_gmail" href="https://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&amp;linkname=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" title="Gmail" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=http%3A%2F%2Fwww.valeriofinazzo.it%2Fwordpress%2F2020%2F09%2Ftutorial-go-implementare-dei-servizi-http%2F&#038;title=TUTORIAL%20GO%20%E2%80%93%20IMPLEMENTARE%20DEI%20SERVIZI%20HTTP" data-a2a-url="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/" data-a2a-title="TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP"></a></p>The post <a href="http://www.valeriofinazzo.it/wordpress/2020/09/tutorial-go-implementare-dei-servizi-http/">TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP</a> first appeared on <a href="http://www.valeriofinazzo.it/wordpress">www.valeriofinazzo.it</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
