A Go client library for consuming ServiceStack services using typed DTOs.
- 🚀 Typed request/response DTOs
- đź”’ Built-in authentication support (Bearer Token & Basic Auth)
- 🔄 Support for all HTTP verbs (GET, POST, PUT, DELETE, PATCH)
⚠️ ServiceStack error handling with field-level validation errors- 📦 Zero external dependencies (uses only Go standard library)
- âś… Full test coverage
ServiceStack Client Go Library
A Go HTTP client library for consuming ServiceStack services.
go get github.com/ServiceStack/servicestack-goTypically, DTOs are generated using ServiceStack's code generation tools. For Go, use:
x goOr manually define your DTOs:
package main
import "github.com/ServiceStack/servicestack-go"
// Request DTO
type HelloRequest struct {
Name string `json:"name"`
}
// Implement IReturn interface to specify response type
func (r *HelloRequest) ResponseType() interface{} {
return &HelloResponse{}
}
// Response DTO
type HelloResponse struct {
Result string `json:"result"`
}client := servicestack.NewJsonServiceClient("https://your-service.com")// GET request
request := &HelloRequest{Name: "World"}
result, err := client.Get(request)
if err != nil {
log.Fatal(err)
}
response := result.(*HelloResponse)
fmt.Println(response.Result)
// POST request
result, err = client.Post(request)
// PUT, DELETE, PATCH also supported
result, err = client.Put(request)
result, err = client.Delete(request)
result, err = client.Patch(request)client := servicestack.NewJsonServiceClient("https://your-service.com")
client.SetBearerToken("your-token-here")
// Now all requests include: Authorization: Bearer your-token-hereclient := servicestack.NewJsonServiceClient("https://your-service.com")
client.SetCredentials("username", "password")
// Now all requests include: Authorization: Basic <base64-encoded-credentials>type AuthenticateRequest struct {
Provider string `json:"provider"`
UserName string `json:"userName"`
Password string `json:"password"`
}
func (r *AuthenticateRequest) ResponseType() interface{} {
return &AuthenticateResponse{}
}
type AuthenticateResponse struct {
SessionId string `json:"sessionId"`
BearerToken string `json:"bearerToken"`
}
// Authenticate
authRequest := &AuthenticateRequest{
Provider: "credentials",
UserName: "user",
Password: "pass",
}
result, err := client.Post(authRequest)
if err != nil {
log.Fatal(err)
}
authResponse := result.(*AuthenticateResponse)
client.SetBearerToken(authResponse.BearerToken)ServiceStack errors include detailed validation information:
result, err := client.Post(request)
if err != nil {
if webEx, ok := err.(*servicestack.WebServiceException); ok {
fmt.Printf("Error: %s - %s\n",
webEx.ResponseStatus.ErrorCode,
webEx.ResponseStatus.Message)
// Handle field-level validation errors
for _, fieldError := range webEx.ResponseStatus.Errors {
fmt.Printf("Field '%s': %s\n",
fieldError.FieldName,
fieldError.Message)
}
} else {
log.Fatal(err)
}
}client := servicestack.NewJsonServiceClient("https://your-service.com")
client.SetTimeout(60 * time.Second)client := servicestack.NewJsonServiceClient("https://your-service.com")
client.Headers["X-Custom-Header"] = "value"package main
import (
"fmt"
"log"
"github.com/ServiceStack/servicestack-go"
)
type HelloRequest struct {
Name string `json:"name"`
}
func (r *HelloRequest) ResponseType() interface{} {
return &HelloResponse{}
}
type HelloResponse struct {
Result string `json:"result"`
}
func main() {
// Create client
client := servicestack.NewJsonServiceClient("https://test.servicestack.net")
// Make request
request := &HelloRequest{Name: "World"}
result, err := client.Post(request)
if err != nil {
log.Fatal(err)
}
// Use response
response := result.(*HelloResponse)
fmt.Println(response.Result)
}NewJsonServiceClient(baseURL string)- Create a new clientGet(request IReturn)- Send a GET requestPost(request IReturn)- Send a POST requestPut(request IReturn)- Send a PUT requestDelete(request IReturn)- Send a DELETE requestPatch(request IReturn)- Send a PATCH requestSend(method string, request interface{}, responseType interface{})- Send with custom methodSetTimeout(timeout time.Duration)- Set request timeoutSetBearerToken(token string)- Set bearer token authenticationSetCredentials(username, password string)- Set basic authentication
IReturn- Implemented by request DTOs that return a responseResponseType() interface{}- Returns the expected response type
ResponseStatus- ServiceStack error response statusResponseError- Field-level validation errorWebServiceException- ServiceStack service exception
go test -vcd examples
go run main.go
import (
"context"
"fmt"
"log"
"github.com/ServiceStack/servicestack-go"
)
func main() {
// Create a new client
client := servicestack.NewClient("https://api.example.com")
// Set custom headers if needed
client.SetHeader("Authorization", "Bearer your-token")
// Define your request and response types
type HelloRequest struct {
Name string `json:"name"`
}
type HelloResponse struct {
Result string `json:"result"`
}
// Make a POST request
request := HelloRequest{Name: "World"}
var response HelloResponse
ctx := context.Background()
err := client.Post(ctx, "/hello", request, &response)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Result)
}- Support for all HTTP methods: GET, POST, PUT, DELETE, PATCH
- Automatic JSON serialization/deserialization
- Context support for cancellation and timeouts
- Custom headers support
- Simple and idiomatic Go API
client := servicestack.NewClient("https://api.example.com")client.SetHeader("Authorization", "Bearer token")
client.SetHeader("X-Custom-Header", "value")var response MyResponse
err := client.Get(ctx, "/endpoint", &response)request := MyRequest{...}
var response MyResponse
err := client.Post(ctx, "/endpoint", request, &response)request := MyRequest{...}
var response MyResponse
err := client.Put(ctx, "/endpoint", request, &response)var response MyResponse
err := client.Delete(ctx, "/endpoint", &response)request := MyRequest{...}
var response MyResponse
err := client.Patch(ctx, "/endpoint", request, &response)This library is released under the same license as ServiceStack.
Contributions are welcome! Please feel free to submit a Pull Request. See LICENSE for details.