executor.go•1.27 kB
package graphql
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func Execute(endpoint string, input map[string]any, op *Operation, headers map[string]string) (any, error) {
reqBody := graphqlRequest{
Query: op.Raw,
Variables: input,
}
jsonBody, err := json.Marshal(reqBody)
if err != nil {
return nil, fmt.Errorf("failed to marshal request: %w", err)
}
req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonBody))
if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err)
}
req.Header.Set("Content-Type", "application/json")
// Add any custom headers
for key, value := range headers {
req.Header.Set(key, value)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("GraphQL request failed: %w", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("failed to read response: %w", err)
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("GraphQL error (%d): %s", resp.StatusCode, string(body))
}
var result map[string]any
if err := json.Unmarshal(body, &result); err != nil {
return nil, fmt.Errorf("failed to parse GraphQL response: %w", err)
}
return result, nil
}