не получается получить данные аргумента query запроса в graphql
В запросе принимаю аргумент filters , в котором передаю данные такого вида:
[{code:"category",id:19},{code:"brand",id:39}]
Определил input тип данных для аргумента filters в запросе.
Сам запрос такой:
http://localhost:8000/graphql?query={product(filters:[{code:"category",id:19},{code:"brand",id:39}],product_id:18810){product_id,name}}
В резолвере пытаюсь привести filters к слайсу структуры, но получаю false
filters, filtersOk := p.Args["filters"].([]Filter)
//filtersOk false
Подскажите как это исправить. неверный формат данных?
Упрощенный пример воспроизводящий ошибку: https://play.golang.org/p/Jrb8Kom3Vxm
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/graphql-go/graphql"
)
type Product struct {
ProductId int64 `json:"product_id"`
Name string `json:"name"`
}
type Filter struct {
Id int64 `json:"id"`
Code string `json:"code"`
}
var productType = graphql.NewObject(graphql.ObjectConfig{
Name: "Product",
Fields: graphql.Fields{
"product_id": &graphql.Field{
Type: graphql.Int,
},
"name": &graphql.Field{
Type: graphql.String,
},
},
},
)
var FiltersInputType = graphql.NewInputObject(graphql.InputObjectConfig{
Name: "FiltersInput",
Fields: graphql.InputObjectConfigFieldMap{
"id": &graphql.InputObjectFieldConfig{
Type: graphql.Int,
},
"code": &graphql.InputObjectFieldConfig{
Type: graphql.String,
},
},
},
)
var queryType = graphql.NewObject(graphql.ObjectConfig{
Name: "Query",
Fields: graphql.Fields{
/*
http://localhost:8000/graphql?query={product(product_id:18810,filters:[{code:"category",id:19},{code:"brand",id:39}]){product_id,name}}
*/
"product": &graphql.Field{
Type: productType,
Description: "Get product by product_id",
Args: graphql.FieldConfigArgument{
"product_id": &graphql.ArgumentConfig{
Type: graphql.Int,
},
"filters": &graphql.ArgumentConfig{
Type: graphql.NewList(FiltersInputType),
},
},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
p_id, pOk := p.Args["product_id"].(int)
filters, filtersOk := p.Args["filters"].([]Filter)
fmt.Println(filters, filtersOk)
if pOk {
product_id := int64(p_id)
// ищем товар
for _, product := range products {
if product.ProductId == product_id {
fmt.Println("Name: ", product.Name, " queryType")
return product, nil
}
}
}
return nil, nil
},
},
},
})
var schema, _ = graphql.NewSchema(
graphql.SchemaConfig{
Query: queryType,
},
)
func executeQuery(query string, schema graphql.Schema) *graphql.Result {
result := graphql.Do(graphql.Params{
Schema: schema,
RequestString: query,
})
if len(result.Errors) > 0 {
fmt.Printf("{\"errors\": [{\"message\": \"%v\"}], \"data\":null}", result.Errors)
}
fmt.Println("Result: ", result, " executeQuery")
return result
}
// products
var products = []Product{
{
ProductId: 18810,
Name: "Тетрадь",
},
}
func main() {
http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) {
requestData := r.URL.Query().Get("query")
result := executeQuery(requestData, schema)
json.NewEncoder(w).Encode(result)
})
fmt.Println("Server is running on port 8000")
http.ListenAndServe(":8000", nil)
}