{"id":638,"date":"2020-09-27T21:49:13","date_gmt":"2020-09-27T19:49:13","guid":{"rendered":"http:\/\/www.valeriofinazzo.it\/wordpress\/?p=638"},"modified":"2020-10-30T17:39:33","modified_gmt":"2020-10-30T16:39:33","slug":"tutorial-golang-eseguire-chiamate-http","status":"publish","type":"post","link":"http:\/\/www.valeriofinazzo.it\/wordpress\/2020\/09\/tutorial-golang-eseguire-chiamate-http\/","title":{"rendered":"TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP"},"content":{"rendered":"\n<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net\/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. <\/p>\n\n\n\n<p>Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e  un oggetto Error.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tresponse, err := http.Get(\"http:\/\/www.google.it\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer response.Body.Close()\n\tfmt.Println(\"Response status:\", response.Status)\n\tbody, err := ioutil.ReadAll(response.Body)\n\tfmt.Println(\"Response body:\", string(body))<\/pre>\n\n\n\n<p>Nell&#8217;esempio sto invocando la homepage di google, e verifico la presenza di errore e il codice restituito dalla risposta. Successivamente tramite  il package ioutil recupero il body della response e lo stampo  a video.<\/p>\n\n\n\n<p>Se invece volessi inviare una post Golang mette a disposizione  2 funzioni: post e postForm. <\/p>\n\n\n\n<p>La funzione post riceve in ingresso l&#8217;url cui inviare la post, il content type del dato che sto inviando e un reader del package io<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tresponse, err = http.Post(\"http:\/\/www.google.it\", \"image\/jpeg\", bytes.NewBufferString(\"prova\"))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"Response status:\", response.Status)<\/pre>\n\n\n\n<p>La funzione postForm invece riceve in ingresso l&#8217;url cui inviare la post e il form dei dati chiave, valore<\/p>\n\n\n\n<p>Le 3 funzioni consentono di inviare get e post, ma qualora volessi usare altri metodi come la put o la delete occorre usare il metodo addNewRequest per creare una request e usare il client http per inviare la richiesta.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">request, err := http.NewRequest(http.MethodDelete, \"http:\/\/www.google.it\", bytes.NewBufferString(\"prova\"))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tclient := &amp;http.Client{}\n\tresponse, err = client.Do(request)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"Response status:\", response.Status)<\/pre>\n\n\n\n<p>Per gestire le caratteristiche avanzate delle connessioni Go mette a disposizione l&#8217;oggetto Transport che opportunamente configurato consente di definire un proxy per l&#8217;invocazione del servizio. Questo caso si presenta quando il nostro client \u00e8 presente all&#8217;interno di una rete il cui accesso ad internet \u00e8 veicolato dalla presenza di un proxy.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tproxyUrl, err := url.Parse(\"http:\/\/user:password@127.0.0.1:3128\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ttr := &amp;http.Transport{\n\t\tMaxIdleConns:       10,\n\t\tIdleConnTimeout:    30 * time.Second,\n\t\tDisableCompression: true,\n\t\tProxy:              http.ProxyURL(proxyUrl),\n\t}\n\tclient = &amp;http.Client{Transport: tr}\n\tresponse, err = client.Do(request)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"Response status:\", response.Status)<\/pre>\n\n\n\n<p>Qualora invece il nostro server voglia un certificato occorre caricare il certificato e configurato sempre nel transport affinch\u00e8 venga usato in trasmissione<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\tcaCert, err := ioutil.ReadFile(\"miocertificato.crt\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tcaCertPool := x509.NewCertPool()\n\tcaCertPool.AppendCertsFromPEM(caCert)\n\ttr := &amp;http.Transport{\n\t\tMaxIdleConns:       10,\n\t\tIdleConnTimeout:    30 * time.Second,\n\t\tDisableCompression: true,\n\t\tTLSClientConfig: &amp;tls.Config{\n\t\t\tRootCAs: caCertPool,\n\t\t},\n\t}\n\tclient = &amp;http.Client{Transport: tr}<\/pre>\n\n\n\n<p>Nell&#8217;esempio sto leggendo il certificato e lo sto configurando all&#8217;interno del transport per poi fornirlo al client.<\/p>\n\n\n\n<p>Abbiamo quindi visto come invocare i vari metodi e come gestire una rete con proxy e una connessione crittografata con invio del certificato.<\/p>\n\n\n\n<p>Alla prossima<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama &#8220;net\/http&#8221;. Vediamo subito come gestire i principali casi d&#8217;uso. Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e un oggetto Error. Nell&#8217;esempio sto invocando la homepage di &hellip; <a href=\"http:\/\/www.valeriofinazzo.it\/wordpress\/2020\/09\/tutorial-golang-eseguire-chiamate-http\/\" class=\"more-link\">Continua la lettura di <span class=\"screen-reader-text\">TUTORIAL GOLANG &#8211; ESEGUIRE CHIAMATE HTTP<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[148],"tags":[145,132,143,144],"_links":{"self":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/638"}],"collection":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":1,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":639,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/posts\/638\/revisions\/639"}],"wp:attachment":[{"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.valeriofinazzo.it\/wordpress\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}