Szukaj…


Składnia

  • resp, err: = http.Get (url) // Wykonuje żądanie HTTP GET z domyślnym klientem HTTP. Błąd inny niż zero jest zwracany, jeśli żądanie nie powiedzie się.
  • resp, err: = http.Post (url, bodyType, body) // Wykonuje żądanie HTTP POST z domyślnym klientem HTTP. Błąd inny niż zero jest zwracany, jeśli żądanie nie powiedzie się.
  • resp, err: = http.PostForm (adres URL, wartości) // Wykonuje żądanie HTTP POST z domyślnym klientem HTTP. Błąd inny niż zero jest zwracany, jeśli żądanie nie powiedzie się.

Parametry

Parametr Detale
odpowiednio Odpowiedź typu *http.Response na żądanie HTTP
błądzić error . Jeśli nie zero, oznacza to błąd, który wystąpił w momencie wywołania funkcji.
URL Adres URL typu string do którego należy wysłać żądanie HTTP.
bodyType Typ MIME typu string ładunku treści żądania POST.
ciało io.Reader (implementuje io.Reader Read() ), która będzie odczytywana do momentu osiągnięcia błędu, który zostanie przesłany jako ładunek treści żądania POST.
wartości Mapa klucz-wartość typu url.Values . url.Values . Podstawowym typem jest ciąg map[string][]string .

Uwagi

Ważne jest, aby defer resp.Body.Close() po każdym żądaniu HTTP, które nie zwraca błędu innego niż zero, w przeciwnym razie nastąpi wyciek zasobów.

Basic GET

Wykonaj podstawowe żądanie GET i wydrukuje zawartość strony (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))
}

POBIERZ za pomocą parametrów adresu URL i odpowiedzi JSON

Żądanie 10 najlepszych ostatnio aktywnych wpisów StackOverflow przy użyciu interfejsu API wymiany stosów.

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)
    }
}

Przekroczono limit czasu w kontekście

1.7+

Przekroczenie limitu czasu żądania HTTP z kontekstem można wykonać tylko przy użyciu standardowej biblioteki (nie podrepos) w wersji 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()

Przed 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()

Dalsza lektura

Aby uzyskać więcej informacji o pakiecie context , zobacz Kontekst .

Żądanie PUT obiektu JSON

Poniższe aktualizuje obiekt użytkownika za pomocą żądania PUT i drukuje kod statusu żądania:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow