mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-10-31 10:39:30 +00:00 
			
		
		
		
	
		
			
	
	
		
			223 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			223 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Go SDK | ||
|  | slug: /sdk/go | ||
|  | --- | ||
|  | 
 | ||
|  | # Go SDK 
 | ||
|  | 
 | ||
|  | We now present a high-level Go API as a gentle wrapper to interact with the OpenMetadata API. | ||
|  | 
 | ||
|  | The open-source OpenMetadata SDK for Go simplifies provisioning, managing, and using OpenMetadata resources from the Go application code. \ | ||
|  | The OpenMetadata SDK for Go modules build on top of the underlying OpenMetadata REST API, allows you to use those APIs through familiar Go paradigms. | ||
|  | 
 | ||
|  | You can find the source code for the OpenMetadata libraries in the [GitHub repository](https://github.com/open-metadata/openmetadata-sdk/tree/main/openmetadata-go-client). As an open-source project, contributions are always welcome! | ||
|  | 
 | ||
|  | You can add the module to your application with the below command | ||
|  | 
 | ||
|  | ```sh | ||
|  | go get github.com/open-metadata/openmetadata-sdk/openmetadata-go-client | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Establish OpenMetadata Server Connection
 | ||
|  | 
 | ||
|  | To create OpenMetadata Gateway, you will need to establish a connection with *OpenMetadata Server*. The following inputs will be needed: | ||
|  | * `BaseURL`: The url on which your instance of OpenMetadata is up and running (include the port if you need to e.g. http://localhost:8585). | ||
|  | * `APIVersion`: pass an empty string -- this will be `v1` for now. | ||
|  | * `Retry`: number of time the request should retry if the status code returned is in `RetryCodes`. Use `0` to use the default value | ||
|  | * `RetryWait`: number of second to wait betwee retries. Pass 0 to use the default value | ||
|  | * `RetryCodes`: HTTP status that will trigger a retry. Pass `nil` to use the default | ||
|  | * `AuthTokenMode`: defaults to `Bearer` | ||
|  | * `AccessToken`: JWT token use to authenticate the request | ||
|  | 
 | ||
|  | ```go | ||
|  | // main.go | ||
|  | package main | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"github.com/open-metadata/openmetadata-sdk/openmetadata-go-client/pkg/ometa" | ||
|  | ) | ||
|  | 
 | ||
|  | func main() { | ||
|  |     restConfig := ometa.NewRestConfig( | ||
|  | 		"http://localhost:8585", | ||
|  | 		"", // APIVersion | ||
|  | 		0, // Retry -> defaults to 3 | ||
|  | 		0, // RetryWait -> defaults to 30 seconds | ||
|  | 		nil, // RetryCodes -> defaults to [429, 504]  | ||
|  | 		"JWTToken", | ||
|  | 	) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Create OpenMetadata Gateway
 | ||
|  | 
 | ||
|  | Once the connection details are provided, you can create an OpenMetadata Gateway | ||
|  | using the following piece of code. | ||
|  | 
 | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | 
 | ||
|  | func main() { | ||
|  |     ... | ||
|  |     rest := ometa.NewRest(restConfig) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ## How to Use APIs Using the Java Client
 | ||
|  | Once you have instantiated a `Rest` object you can call any of the 4 methods to perform any kind of operation against OpenMetadata API | ||
|  | 
 | ||
|  | ### `Get` method
 | ||
|  | **Method signature** | ||
|  | ```go | ||
|  | func (rest Rest) Get( | ||
|  | 	path string, | ||
|  | 	header http.Header, | ||
|  | 	extraHeader map[string][]string, | ||
|  | 	queryParams map[string]string) (map[string]any, error) | ||
|  | ``` | ||
|  | 
 | ||
|  | **Example** | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | func main() { | ||
|  |     ... | ||
|  |     path := "tables" | ||
|  | 	body, err := rest.Get(path, nil, nil, nil) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | ### `Post` method
 | ||
|  | **Method signature** | ||
|  | ```go | ||
|  | func (rest Rest) Post( | ||
|  | 	path string, | ||
|  | 	data map[string]interface{}, | ||
|  | 	header http.Header, | ||
|  | 	extraHeader map[string][]string, | ||
|  | 	queryParams map[string]string) (map[string]any, error) | ||
|  | ``` | ||
|  | 
 | ||
|  | **Example** | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | func main() { | ||
|  |     ... | ||
|  |     path := "tables" | ||
|  |     data := map[string]interface{}{ | ||
|  |         "name":           "goClientTestTable", | ||
|  |         "databaseSchema": "sample_data.ecommerce_db.shopify", | ||
|  |         "columns": []map[string]interface{}{ | ||
|  |             { | ||
|  |                 "name":     "columnOne", | ||
|  |                 "dataType": "NUMBER", | ||
|  |             }, | ||
|  |             { | ||
|  |                 "name":     "columnTwo", | ||
|  |                 "dataType": "NUMBER", | ||
|  |             }, | ||
|  |         }, | ||
|  |     } | ||
|  | 	body, err := rest.Post(path, data, nil, nil, nil) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ### `Put` method
 | ||
|  | **Method signature** | ||
|  | ```go | ||
|  | func (rest Rest) Put( | ||
|  | 	path string, | ||
|  | 	data map[string]interface{}, | ||
|  | 	header http.Header, | ||
|  | 	extraHeader map[string][]string, | ||
|  | 	queryParams map[string]string) (map[string]any, error) | ||
|  | ``` | ||
|  | 
 | ||
|  | **Example** | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | func main() { | ||
|  |     ... | ||
|  |     path := "tables" | ||
|  | 	data := map[string]interface{}{ | ||
|  | 		"name":           "goClientTestTable", | ||
|  | 		"databaseSchema": "sample_data.ecommerce_db.shopify", | ||
|  | 		"columns": []map[string]interface{}{ | ||
|  | 			{ | ||
|  | 				"name":     "columnOne", | ||
|  | 				"dataType": "NUMBER", | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				"name":     "columnTwo", | ||
|  | 				"dataType": "NUMBER", | ||
|  | 			}, | ||
|  | 			{ | ||
|  | 				"name":     "columnThree", | ||
|  | 				"dataType": "NUMBER", | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 	} | ||
|  | 	body, err := rest.Put(path, data, nil, nil, nil) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ### `Patch` method
 | ||
|  | **Method signature** | ||
|  | ```go | ||
|  | func (rest Rest) Patch( | ||
|  | 	path string, | ||
|  | 	data []map[string]interface{}, | ||
|  | 	header http.Header, | ||
|  | 	extraHeader map[string][]string, | ||
|  | 	queryParams map[string]string) (map[string]any, error) | ||
|  | ``` | ||
|  | 
 | ||
|  | **Example** | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | func main() { | ||
|  |     ... | ||
|  |     path := "tables" | ||
|  | 	patchPath := fmt.Sprintf("tables/%s", id) | ||
|  | 	data := []map[string]interface{}{ | ||
|  | 		{ | ||
|  | 			"op":    "add", | ||
|  | 			"path":  "/description", | ||
|  | 			"value": "This is a test table", | ||
|  | 		}, | ||
|  | 	} | ||
|  | 	body, err := rest.Patch(path, data, nil, nil, nil) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ### `Delete` method
 | ||
|  | **Method signature** | ||
|  | ```go | ||
|  | func (rest Rest) Delete( | ||
|  | 	path string, | ||
|  | 	header http.Header, | ||
|  | 	extraHeader map[string][]string, | ||
|  | 	queryParams map[string]string) (map[string]any, error) | ||
|  | ``` | ||
|  | 
 | ||
|  | **Example** | ||
|  | ```go | ||
|  | // main.go | ||
|  | ... | ||
|  | func main() { | ||
|  |     ... | ||
|  | 	path := fmt.Sprintf("tables/%s", id) | ||
|  | 	queryParams := map[string]string{ | ||
|  | 		"hardDelete": "true", | ||
|  | 		"recursive":  "true", | ||
|  | 	} | ||
|  | 	rest.Delete(path, nil, nil, queryParams) | ||
|  | } | ||
|  | ``` |