Hey there, fellow developer! Ready to dive into the world of Adobe Experience Manager (AEM) API integration using Go? You're in for a treat. AEM's powerful API opens up a world of possibilities, and Go's simplicity and efficiency make it a perfect match. Let's get cracking!
Before we jump in, make sure you've got:
Got all that? Great! Let's move on.
First things first, let's set up our Go project:
mkdir aem-api-integration cd aem-api-integration go mod init github.com/yourusername/aem-api-integration
Now, let's grab the dependencies we'll need:
go get github.com/go-resty/resty/v2
AEM uses OAuth 2.0 for authentication. Here's a quick snippet to get you started:
import ( "github.com/go-resty/resty/v2" ) func getAccessToken(clientID, clientSecret string) (string, error) { client := resty.New() resp, err := client.R(). SetFormData(map[string]string{ "grant_type": "client_credentials", "client_id": clientID, "client_secret": clientSecret, }). Post("https://your-aem-instance.com/oauth/token") // Parse the response and return the access token // Error handling omitted for brevity }
Now that we're authenticated, let's make some requests:
func getPage(accessToken, path string) (*resty.Response, error) { client := resty.New() return client.R(). SetAuthToken(accessToken). Get("https://your-aem-instance.com/content/path/to/page.json") } func createPage(accessToken, parentPath, pageName string) (*resty.Response, error) { client := resty.New() return client.R(). SetAuthToken(accessToken). SetFormData(map[string]string{ "cmd": "createPage", "parentPath": parentPath, "title": pageName, }). Post("https://your-aem-instance.com/content.json") }
Don't forget to implement robust error handling and logging. It'll save you hours of headaches later:
import ( "log" ) // Use this throughout your code if err != nil { log.Printf("Error occurred: %v", err) return nil, err }
AEM returns JSON responses. Let's parse them:
type Page struct { Title string `json:"jcr:title"` Path string `json:"jcr:path"` } func parsePage(resp *resty.Response) (*Page, error) { var page Page err := json.Unmarshal(resp.Body(), &page) if err != nil { return nil, err } return &page, nil }
Here's a quick example of creating a page:
func CreatePage(accessToken, parentPath, title string) (*Page, error) { resp, err := createPage(accessToken, parentPath, title) if err != nil { return nil, err } return parsePage(resp) }
Want to speed things up? Try concurrent requests:
import ( "sync" ) func GetMultiplePages(accessToken string, paths []string) ([]*Page, error) { var wg sync.WaitGroup pages := make([]*Page, len(paths)) for i, path := range paths { wg.Add(1) go func(i int, path string) { defer wg.Done() resp, _ := getPage(accessToken, path) pages[i], _ = parsePage(resp) }(i, path) } wg.Wait() return pages, nil }
Don't forget to test your code! Here's a simple example:
func TestGetPage(t *testing.T) { accessToken := "your-access-token" path := "/content/path/to/page" resp, err := getPage(accessToken, path) if err != nil { t.Fatalf("Failed to get page: %v", err) } page, err := parsePage(resp) if err != nil { t.Fatalf("Failed to parse page: %v", err) } if page.Title == "" { t.Error("Page title is empty") } }
And there you have it! You've just built an AEM API integration in Go. Pretty cool, right? Remember, this is just the tip of the iceberg. There's so much more you can do with AEM's API. Keep exploring, keep coding, and most importantly, have fun!
Need more info? Check out the AEM API documentation and the Go documentation. Happy coding!