Buscar..


Sintaxis

  • resp, err: = http.Get (url) // Realiza una solicitud GET de HTTP con el cliente HTTP predeterminado. Se devuelve un error no nulo si la solicitud falla.
  • resp, err: = http.Post (url, bodyType, body) // Realiza una solicitud HTTP POST con el cliente HTTP predeterminado. Se devuelve un error no nulo si la solicitud falla.
  • resp, err: = http.PostForm (url, valores) // Realiza una solicitud POST del formulario HTTP con el cliente HTTP predeterminado. Se devuelve un error no nulo si la solicitud falla.

Parámetros

Parámetro Detalles
resp Una respuesta de tipo *http.Response a una solicitud HTTP
errar Un error Si no es nulo, representa un error que ocurrió cuando se llamó a la función.
url Una URL de tipo string para realizar una solicitud HTTP.
tipo de cuerpo El tipo MIME de tipo string de la carga útil del cuerpo de una solicitud POST.
cuerpo Un io.Reader (implementa Read() ) que se leerá hasta que se alcance un error para enviarlo como la carga útil del cuerpo de una solicitud POST.
valores Un mapa clave-valor de tipo url.Values . El tipo subyacente es una map[string][]string .

Observaciones

Es importante defer resp.Body.Close() después de cada solicitud HTTP que no devuelva un error no nulo, de lo contrario, se perderán recursos.

GET básico

Realice una solicitud GET básica e imprima el contenido de un sitio (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 con parámetros de URL y una respuesta JSON

Una solicitud de las 10 publicaciones más recientes de StackOverflow activas que utilizan la API de Exchange Stack.

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

Tiempo de espera de solicitud con un contexto

1.7+

El tiempo de espera de una solicitud HTTP con un contexto se puede lograr con solo la biblioteca estándar (no las subposiciones) en 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()

Antes de 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()

Otras lecturas

Para obtener más información sobre el paquete de context , consulte Contexto .

PUT solicitud de objeto JSON

Lo siguiente actualiza un objeto de usuario a través de una solicitud PUT e imprime el código de estado de la solicitud:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow