Translate

Mostrando las entradas con la etiqueta Resty. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Resty. Mostrar todas las entradas

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!!