Make query parameters field reusable

This commit is contained in:
Svilen Markov 2025-03-01 23:29:28 +00:00
parent 948289a038
commit 8da26ab409
2 changed files with 61 additions and 34 deletions

View File

@ -219,3 +219,55 @@ func (p *proxyOptionsField) UnmarshalYAML(node *yaml.Node) error {
return nil return nil
} }
type queryParametersField map[string][]string
func (q *queryParametersField) UnmarshalYAML(node *yaml.Node) error {
var decoded map[string]any
if err := node.Decode(&decoded); err != nil {
return err
}
*q = make(queryParametersField)
for key, value := range decoded {
switch v := value.(type) {
case string:
(*q)[key] = []string{v}
case int, int8, int16, int32, int64, float32, float64:
(*q)[key] = []string{fmt.Sprintf("%v", v)}
case []string:
(*q)[key] = append((*q)[key], v...)
case []any:
for _, item := range v {
switch item := item.(type) {
case string:
(*q)[key] = append((*q)[key], item)
case int, int8, int16, int32, int64, float32, float64:
(*q)[key] = append((*q)[key], fmt.Sprintf("%v", item))
case bool:
(*q)[key] = append((*q)[key], fmt.Sprintf("%t", item))
default:
return fmt.Errorf("invalid query parameter value type: %T", item)
}
}
default:
return fmt.Errorf("invalid query parameter value type: %T", value)
}
}
return nil
}
func (q *queryParametersField) toQueryString() string {
query := url.Values{}
for key, values := range *q {
for _, value := range values {
query.Add(key, value)
}
}
return query.Encode()
}

View File

@ -10,7 +10,6 @@ import (
"log/slog" "log/slog"
"math" "math"
"net/http" "net/http"
"net/url"
"time" "time"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
@ -24,7 +23,7 @@ type customAPIWidget struct {
Template string `yaml:"template"` Template string `yaml:"template"`
Frameless bool `yaml:"frameless"` Frameless bool `yaml:"frameless"`
Headers map[string]string `yaml:"headers"` Headers map[string]string `yaml:"headers"`
Parameters map[string]interface{} `yaml:"parameters"` Parameters queryParametersField `yaml:"parameters"`
APIRequest *http.Request `yaml:"-"` APIRequest *http.Request `yaml:"-"`
compiledTemplate *template.Template `yaml:"-"` compiledTemplate *template.Template `yaml:"-"`
CompiledHTML template.HTML `yaml:"-"` CompiledHTML template.HTML `yaml:"-"`
@ -53,31 +52,7 @@ func (widget *customAPIWidget) initialize() error {
return err return err
} }
query := url.Values{} req.URL.RawQuery = widget.Parameters.toQueryString()
for key, value := range widget.Parameters {
switch v := value.(type) {
case string:
query.Add(key, v)
case int, int8, int16, int32, int64, float32, float64:
query.Add(key, fmt.Sprintf("%v", v))
case []string:
for _, item := range v {
query.Add(key, item)
}
case []interface{}:
for _, item := range v {
switch item := item.(type) {
case string:
query.Add(key, item)
case int, int8, int16, int32, int64, float32, float64:
query.Add(key, fmt.Sprintf("%v", item))
}
}
}
}
req.URL.RawQuery = query.Encode()
for key, value := range widget.Headers { for key, value := range widget.Headers {
req.Header.Add(key, value) req.Header.Add(key, value)