Поиск…


Синтаксис

  • resp, err: = http.Get (url) // Делает HTTP-запрос GET с помощью HTTP-клиента по умолчанию. Если запрос не выполнен, возвращается ошибка, отличная от нуля.
  • resp, err: = http.Post (url, bodyType, body) // Делает HTTP-запрос POST с клиентом по умолчанию HTTP. Если запрос не выполнен, возвращается ошибка, отличная от нуля.
  • resp, err: = http.PostForm (url, values) // Делает запрос POST-формы HTTP с HTTP-клиентом по умолчанию. Если запрос не выполнен, возвращается ошибка, отличная от нуля.

параметры

параметр подробности
соответственно Ответ типа *http.Response на HTTP-запрос
заблуждаться error . Если нет, это означает ошибку, возникшую при вызове функции.
URL URL-адрес string типа, для которой требуется HTTP-запрос.
телосложение Тип MIME типа string полезной нагрузки тела запроса POST.
тело io.Reader (реализует Read() ), который будет считан до тех пор, пока не будет достигнута ошибка, которая будет отправлена ​​в качестве полезной нагрузки тела запроса POST.
ценности Карта ключевого значения типа url.Values . Основной тип - это map[string][]string .

замечания

Важно defer resp.Body.Close() после каждого HTTP-запроса, который не возвращает ошибку non-nil, иначе будут пропущены ресурсы.

Основной GET

Выполните основной запрос GET и распечатайте содержимое сайта (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))
}

GET с параметрами URL и ответом JSON

Запрос на 10 самых последних активных сообщений StackOverflow, использующих 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)
    }
}

Запрос тайм-аута с контекстом

1.7+

Завершение HTTP-запроса с помощью контекста может быть выполнено только с помощью стандартной библиотеки (а не подпозиции) в версии 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()

До 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()

Дальнейшее чтение

Дополнительные сведения о пакете context см. В разделе « Контекст» .

Запрос PUT объекта JSON

Следующее обновление объекта пользователя через запрос PUT и печать кода состояния запроса:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow