Go - How to use Resty
Tags: go, resty, restyv2, restfulapi
Published: 2023-07-08 14:51:35

## 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:

```bash
go get -u github.com/go-resty/resty/v2
```
---

### 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:

```go
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)
	}
}
```
#### 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:

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

#### 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:

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

#### 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:

```go
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())
}
```

#### 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:

```go
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())
}
```
---

### 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.