Translate

miércoles, 28 de diciembre de 2022

Resty, un cliente rest simple para Golang

 


Resty, es un cliente simple para consultar Apis http. Tiene muchas características :

  • Todos los métodos http: GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS, etc.
  • Métodos simples y encadenables para configuraciones y solicitudes.
  • El cuerpo de la solicitud puede ser una cadena, [] byte, estructura, mapa, segmento e io.Reader también detecta automáticamente el tipo de contenido
  • Procesamiento sin búfer para io.Reader
  • Se puede acceder a la instancia *http.Request nativa durante la ejecución del middleware y la solicitud a través de Request.RawRequest
  • El cuerpo de la solicitud se puede leer varias veces a través de Request.RawRequest.GetBody()
  • Acceso como matriz de []bytes - respuesta.Cuerpo() O Acceso como cadena - respuesta.Cadena()
  • Clasificación y desclasificación automáticas para el tipo de contenido JSON y XML
  • El valor predeterminado es JSON, si proporciona estructura/mapa sin encabezado Content-Type
  • Compatible con RFC7807: application/problem+json & application/problem+xml
  • Resty proporciona una opción para anular JSON Marshal/Unmarshal y XML Marshal/Unmarshal
  • Fácil de cargar uno o más archivos a través de multipart/form-data
  • Detecta automáticamente el tipo de contenido del archivo
  • Solicitud de parámetros de ruta de URL (también conocidos como parámetros de URI)
  • Mecanismo de reintento de retroceso con referencia de función de condición de reintento
  • Middleware de solicitud y respuesta HTTP y REST del cliente Resty
  • Solicitud.SetContext compatible
  • Opción de autorización de BasicAuth y Bearer token
  • Establecer el valor de ContentLength de solicitud para todas las solicitudes o solicitudes en particular
  • Certificados raíz personalizados y certificados de cliente
  • Descargue/guarde la respuesta HTTP directamente en el archivo, como el indicador curl -o. Consulte SetOutputDirectory y SetOutput.
  • Cookies para su solicitud y soporte de CookieJar
  • Solicitud basada en registro SRV en lugar de URL de host
  • Configuración del cliente como Tiempo de espera, RedirectPolicy, Proxy, TLSClientConfig, Transporte, etc.
  • Opcionalmente, permite la solicitud GET con carga útil
  • Admite el registro de la biblioteca JSON externa en Resty
  • Expone el lector de respuestas sin leer la respuesta (sin desarme automático) si es necesario
  • Opción para especificar el tipo de contenido esperado cuando falta el encabezado del tipo de contenido de respuesta. 
  • Admite la implementación de http.RoundTripper
  • seguridad concurrente con goroutine
  • Seguimiento podemos usar Client.EnableTrace y Request.EnableTrace
  • Desde v2.4.0, la información de seguimiento contiene un valor de RequestAttempt y el objeto Request contiene un atributo de intento.
  • Modo de depuración
  • Funciona con HTTP/2 y HTTP/1.1
Puf un monton y si llegaste hasta aca leyendo, te felicito. Ahora vamos a ver un ejemplo, imprimir datos de la api de github : 

package main

import (
"bufio"
"fmt"
"github.com/go-resty/resty/v2"
"os"
"strings"
)

func main() {
fmt.Println("Ingrese el usuario de github : ")

reader := bufio.NewReader(os.Stdin)
user, _ := reader.ReadString('\n')
user = strings.ReplaceAll(user, "\n", "")

url := "https://api.github.com/users/" + user

// Create a Resty Client
client := resty.New()

resp, err := client.R().
EnableTrace().
Get(url)

if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("  Status Code:", resp.StatusCode())
fmt.Println("  Status     :", resp.Status())
fmt.Println("  Proto      :", resp.Proto())
fmt.Println("  Time       :", resp.Time())
fmt.Println("  Received At:", resp.ReceivedAt())
fmt.Println("  Body       :\n", resp)
fmt.Println()
// Explore trace info
fmt.Println("Request Trace Info:")
ti := resp.Request.TraceInfo()
fmt.Println("  DNSLookup     :", ti.DNSLookup)
fmt.Println("  ConnTime      :", ti.ConnTime)
fmt.Println("  TCPConnTime   :", ti.TCPConnTime)
fmt.Println("  TLSHandshake  :", ti.TLSHandshake)
fmt.Println("  ServerTime    :", ti.ServerTime)
fmt.Println("  ResponseTime  :", ti.ResponseTime)
fmt.Println("  TotalTime     :", ti.TotalTime)
fmt.Println("  IsConnReused  :", ti.IsConnReused)
fmt.Println("  IsConnWasIdle :", ti.IsConnWasIdle)
fmt.Println("  ConnIdleTime  :", ti.ConnIdleTime)
fmt.Println("  RequestAttempt:", ti.RequestAttempt)
fmt.Println("  RemoteAddr    :", ti.RemoteAddr.String())
}

}

Y si ingresamos emanuelpeg por ejemplo obtendremos : 

Ingrese el usuario de github : 

emanuelpeg

  Status Code: 200

  Status     : 200 OK

  Proto      : HTTP/2.0

  Time       : 365.365001ms

  Received At: 2022-12-28 16:25:37.481908946 -0300 -03 m=+9.137266439

  Body       :

 {"login":"emanuelpeg","id":1281319,"node_id":"MDQ6VXNlcjEyODEzMTk=","avatar_url":"https://avatars.githubusercontent.com/u/1281319?v=4","gravatar_id":"","url":"https://api.github.com/users/emanuelpeg","html_url":"https://github.com/emanuelpeg","followers_url":"https://api.github.com/users/emanuelpeg/followers","following_url":"https://api.github.com/users/emanuelpeg/following{/other_user}","gists_url":"https://api.github.com/users/emanuelpeg/gists{/gist_id}","starred_url":"https://api.github.com/users/emanuelpeg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emanuelpeg/subscriptions","organizations_url":"https://api.github.com/users/emanuelpeg/orgs","repos_url":"https://api.github.com/users/emanuelpeg/repos","events_url":"https://api.github.com/users/emanuelpeg/events{/privacy}","received_events_url":"https://api.github.com/users/emanuelpeg/received_events","type":"User","site_admin":false,"name":"Emanuel","company":"assembly","blog":"http://emanuelpeg.blogspot.com/","location":"Crespo","email":null,"hireable":null,"bio":null,"twitter_username":null,"public_repos":51,"public_gists":19,"followers":15,"following":9,"created_at":"2011-12-23T03:12:26Z","updated_at":"2022-12-12T19:06:19Z"}


Request Trace Info:

  DNSLookup     : 33.874537ms

  ConnTime      : 165.492638ms

  TCPConnTime   : 48.333281ms

  TLSHandshake  : 83.032505ms

  ServerTime    : 199.757211ms

  ResponseTime  : 274.029µs

  TotalTime     : 365.365001ms

  IsConnReused  : false

  IsConnWasIdle : false

  ConnIdleTime  : 0s

  RequestAttempt: 1

  RemoteAddr    : 20.201.28.148:443


Process finished with the exit code 0


Y Listo!!