DEV Community

Ankit malik
Ankit malik

Posted on

Go - How to use Resty

Introduction:

RESTful APIs have become the cornerstone of modern web development, enabling seamless communication between client and server. In this article, we will explore the power and simplicity of using Resty, a popular HTTP client library, to perform common operations like GET, POST, UPDATE, and DELETE requests in Go. We will also learn how to pass headers in our requests, allowing us to customize and enhance our API interactions.

Installing Resty:

To begin, we need to install Resty in our Go environment. We can use the following command to install the Resty package:

go get -u github.com/go-resty/resty/v2
Enter fullscreen mode Exit fullscreen mode

Examples

Making GET Request:

Let's start by examining how to perform GET requests using Resty v2. The following code snippet demonstrates a simple GET request and binding the response into a struct:

package main

import (
    "fmt"
    "log"

    "github.com/go-resty/resty/v2"
)

type DevUser struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

func main() {
    var users []DevUser

    response, err := resty.New().R().SetResult(&users).Get("https://api.example.com/users")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("GET Response:", response.Status())
    fmt.Printf("Retrieved %d users:\n", len(users))
    for _, user := range users {
        fmt.Printf("User ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email)
    }
}
Enter fullscreen mode Exit fullscreen mode

Making POST Request:

To execute POST requests with Resty v2 and bind the response into a struct, we can use the .SetResult() method. The example below illustrates how to send a POST request with a JSON payload and bind the response into a struct:

package main

import (
    "fmt"
    "log"

    "github.com/go-resty/resty/v2"
)

type DevUser struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

func main() {
    var createdUser DevUser

    payload := DevUser{
        Name:  "John Doe",
        Email: "johndoe@example.com",
    }

    response, err := resty.New().R().
        SetHeader("Content-Type", "application/json").
        SetBody(&payload).
        SetResult(&createdUser).
        Post("https://api.example.com/users")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("POST Response:", response.Status())
    fmt.Printf("Created User: ID: %d, Name: %s, Email: %s\n", createdUser.ID, createdUser.Name, createdUser.Email)
}
Enter fullscreen mode Exit fullscreen mode

Making UPDATE (PUT) Request:

To perform an update operation using Resty v2 and bind the response into a struct, we can utilize the .SetResult() method. The following example demonstrates how to send a PUT request with a JSON payload and bind the response into a struct:

package main

import (
    "fmt"
    "log"

    "github.com/go-resty/resty/v2"
)

type DevUser struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

func main() {
    var updatedUser DevUser

    payload := DevUser{
        Name:  "Updated Name",
        Email: "updated@example.com",
    }

    response, err := resty.New().R().
        SetHeader("Content-Type", "application/json").
        SetBody(&payload).
        SetResult(&updatedUser).
        Put("https://api.example.com/users/123")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("PUT Response:", response.Status())
    fmt.Printf("Updated User: ID: %d, Name: %s, Email: %s\n", updatedUser.ID, updatedUser.Name, updatedUser.Email)
}
Enter fullscreen mode Exit fullscreen mode

Making DELETE Request:

To send a DELETE request using Resty v2, we can utilize the .Delete() method. Here's an example that demonstrates the deletion of a user:

package main

import (
    "fmt"
    "log"

    "github.com/go-resty/resty/v2"
)

type DevUser struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

func main() {
    response, err := resty.New().R().Delete("https://api.example.com/users/123")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("DELETE Response:", response.Status())
}
Enter fullscreen mode Exit fullscreen mode

Passing Headers :

Resty v2 allows us to include custom headers in our requests. The code snippet below demonstrates how to pass headers using Resty v2:

package main

import (
    "fmt"
    "log"

    "github.com/go-resty/resty/v2"
)

type DevUser struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

func main() {
    client := resty.New()
    client.SetHeader("Authorization", "Bearer YOUR_TOKEN")

    response, err := client.R().Get("https://api.example.com/protected-resource")
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("GET with Headers Response:", response.Status())
}
Enter fullscreen mode Exit fullscreen mode

Conclusion:

In this comprehensive guide, we explored how to leverage Resty v2, an easy-to-use HTTP client library, to perform GET, POST, UPDATE, and DELETE requests in Go. We also learned how to pass headers to enhance our API interactions, providing increased customization and security. Additionally, we discovered how to bind API responses into Go structs, allowing for easy handling and manipulation of data. Resty v2 simplifies RESTful API consumption, enabling us to focus on building robust and efficient applications.

Remember to import the Resty v2 package (github.com/go-resty/resty/v2), handle errors effectively, and adapt the examples to fit your specific API endpoints and requirements.

Top comments (1)

Collapse
 
mariusz_jedrzejewski_7955 profile image
Mariusz Jedrzejewski

A 1-year old article, but I want to thank you for showing me a method SetResult(&x) :) Up to yesterday I didn't use it. Now some part of work is easier. Cheers!