Ricerca…


Sintassi

  • resp, err: = http.Get (url) // Esegue una richiesta HTTP GET con il client HTTP predefinito. Un errore non nullo viene restituito se la richiesta non riesce.
  • resp, err: = http.Post (url, bodyType, body) // Fa una richiesta POST HTTP con il client HTTP predefinito. Un errore non nullo viene restituito se la richiesta non riesce.
  • resp, err: = http.PostForm (url, values) // Fa una richiesta POST di form HTTP con il client HTTP predefinito. Un errore non nullo viene restituito se la richiesta non riesce.

Parametri

Parametro Dettagli
resp Una risposta di tipo *http.Response a una richiesta HTTP
sbagliare Un error Se non è nulla, rappresenta un errore che si è verificato quando è stata chiamata la funzione.
url Un URL di tipo string per fare una richiesta HTTP a.
tipo di corpo Il tipo MIME di tipo string del carico utile del corpo di una richiesta POST.
corpo Un io.Reader (implements Read() ) che verrà letto da fino a quando non viene raggiunto un errore da inviare come carico utile del corpo di una richiesta POST.
valori Una mappa valore-chiave di tipo url.Values . Il tipo sottostante è una map[string][]string .

Osservazioni

È importante defer resp.Body.Close() dopo ogni richiesta HTTP che non restituisce un errore non nullo, altrimenti le risorse saranno trapelate.

GET di base

Esegui una richiesta GET di base e stampa il contenuto di un sito (HTML).

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("https://example.com/")
    if err != nil {
        panic(err)
    }

    // It is important to defer resp.Body.Close(), else resource leaks will occur.
    defer resp.Body.Close()

    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    // Will print site contents (HTML) to output
    fmt.Println(string(data))
}

OTTIENI con i parametri URL e una risposta JSON

Una richiesta per i primi 10 post StackOverflow attivi più recenti utilizzando l'API Stack Exchange.

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"
)

const apiURL = "https://api.stackexchange.com/2.2/posts?"

// Structs for JSON decoding
type postItem struct {
    Score int    `json:"score"`
    Link  string `json:"link"`
}

type postsType struct {
    Items []postItem `json:"items"`
}

func main() {
    // Set URL parameters on declaration
    values := url.Values{
        "order": []string{"desc"},
        "sort":  []string{"activity"},
        "site":  []string{"stackoverflow"},
    }

    // URL parameters can also be programmatically set
    values.Set("page", "1")
    values.Set("pagesize", "10")

    resp, err := http.Get(apiURL + values.Encode())
    if err != nil {
        panic(err)
    }

    defer resp.Body.Close()

    // To compare status codes, you should always use the status constants
    // provided by the http package.
    if resp.StatusCode != http.StatusOK {
        panic("Request was not OK: " + resp.Status)
    }

    // Example of JSON decoding on a reader.
    dec := json.NewDecoder(resp.Body)
    var p postsType
    err = dec.Decode(&p)
    if err != nil {
        panic(err)
    }

    fmt.Println("Top 10 most recently active StackOverflow posts:")
    fmt.Println("Score", "Link")
    for _, post := range p.Items {
        fmt.Println(post.Score, post.Link)
    }
}

Richiesta di timeout con un contesto

1.7+

Il timeout di una richiesta HTTP con un contesto può essere eseguito solo con la libreria standard (non i sottorepos) in 1.7+:

import (
    "context"
    "net/http"
    "time"
)

req, err := http.NewRequest("GET", `https://example.net`, nil)
ctx, _ := context.WithTimeout(context.TODO(), 200 * time.Milliseconds)
resp, err := http.DefaultClient.Do(req.WithContext(ctx))
// Be sure to handle errors.
defer resp.Body.Close()

Prima dell'1.7

import (
    "net/http"
    "time"

    "golang.org/x/net/context"
    "golang.org/x/net/context/ctxhttp"
)

ctx, err := context.WithTimeout(context.TODO(), 200 * time.Milliseconds)
resp, err := ctxhttp.Get(ctx, http.DefaultClient, "https://www.example.net")
// Be sure to handle errors.
defer resp.Body.Close()

Ulteriori letture

Per ulteriori informazioni sul pacchetto di context , vedere Contesto .

Richiesta PUT dell'oggetto JSON

Il seguente aggiorna un oggetto Utente tramite una richiesta PUT e stampa il codice di stato della richiesta:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

type User struct {
    Name  string
    Email string
}

func main() {
    user := User{
        Name:  "John Doe",
        Email: "[email protected]",
    }

    // initialize http client
    client := &http.Client{}

    // marshal User to json
    json, err := json.Marshal(user)
    if err != nil {
        panic(err)
    }

    // set the HTTP method, url, and request body
    req, err := http.NewRequest(http.MethodPut, "http://api.example.com/v1/user", bytes.NewBuffer(json))
    if err != nil {
        panic(err)
    }

    // set the request header Content-Type for json
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }

    fmt.Println(resp.StatusCode)
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow