我正在使用GraphQL构建一个API,API的一个选项是下订单。
我使用带有graphql-go的Go 1.16作为GraphQL后端
PlaceOrder API调用的JSON格式为:
{
"order_reference":"unique order reference",
"customer_order_reference":"customer order reference",
"email_address":"email@example.com",
"phone_number":"0123456789",
"billing_address":{
"name":"Billing name",
"address_line_one":"Billing line one",
"address_line_two":"Billing line two",
"address_line_three":"Billing line three",
"address_line_four":"Billing line four",
"postcode":"billing postcode"
},
"delivery_address":{
"name":"Delivery name",
"address_line_one":"Delivery line one",
"address_line_two":"Delivery line two",
"address_line_three":"Delivery line three",
"address_line_four":"Delivery line four",
"postcode":"Delivery postcode"
},
"order_lines":[
{
"product_code":"123456",
"quantity":1
},
{
"product_code":"654321",
"quantity":2
}
]
}
在Go代码中,我将Schema字段设置为:
graphql.Fields{
"placeOrder": &graphql.Field{
Type: order.PlaceOrder(),
Args: graphql.FieldConfigArgument{
"order_reference": &graphql.ArgumentConfig{
Type: graphql.String,
},
"customer_order_reference": &graphql.ArgumentConfig{
Type: graphql.String,
},
"email_address": &graphql.ArgumentConfig{
Type: graphql.String,
},
"phone_number": &graphql.ArgumentConfig{
Type: graphql.String,
},
"billing_address": &graphql.ArgumentConfig{
Type: graphql.NewObject(
graphql.ObjectConfig{
Name: "BillingAddress",
Fields: graphql.Fields{
"name": &graphql.Field{
Type: graphql.String,
},
"address_line_one": &graphql.Field{
Type: graphql.String,
},
"address_line_two": &graphql.Field{
Type: graphql.String,
},
"address_line_three": &graphql.Field{
Type: graphql.String,
},
"address_line_four": &graphql.Field{
Type: graphql.String,
},
"postcode": &graphql.Field{
Type: graphql.String,
},
},
},
),
},
"delivery_address": &graphql.ArgumentConfig{
Type: graphql.NewObject(
graphql.ObjectConfig{
Name: "DeliveryAddress",
Fields: graphql.Fields{
"name": &graphql.Field{
Type: graphql.String,
},
"address_line_one": &graphql.Field{
Type: graphql.String,
},
"address_line_two": &graphql.Field{
Type: graphql.String,
},
"address_line_three": &graphql.Field{
Type: graphql.String,
},
"address_line_four": &graphql.Field{
Type: graphql.String,
},
"postcode": &graphql.Field{
Type: graphql.String,
},
},
},
),
},
"order_lines": &graphql.ArgumentConfig{
Type: graphql.NewList(graphql.NewObject(
graphql.ObjectConfig{
Name: "Line",
Fields: graphql.Fields{
"part_number": &graphql.Field{
Type: graphql.String,
},
"quantity": &graphql.Field{
Type: graphql.String,
},
},
},
)),
},
},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
// Code to interact with Database and assign value to status, reference depending on result of database INSERT and return as "response"
return response, nil
},
},
}
我尝试了几种不同的方法将数据传递到地址和订单行,但似乎不能成功传递它们:例如,我尝试了下面的方法,map[]是fmt.Printf("%+v\n", p.Args)
的结果
查询:
{
placeOrder(
order_reference:"order reference"
customer_order_reference: "cust order reference"
billing_address: {
name: "Billing Name"
address_line_one: "Address line one"
address_line_two: "Address line one"
address_line_three: "Address line one"
address_line_four: "Address line one"
postcode: "Post code"
}
delivery_address: {
name: "Delivery Name"
address_line_one: "Address line one"
address_line_two: "Address line one"
address_line_three: "Address line one"
address_line_four: "Address line one"
postcode: "Post code"
}
order_lines: [
{
part_number: "123456"
quantity: 1
}
]
){
status,
reference
}
}
结果:
map[
customer_order_reference:cust order reference
order_lines:[<nil>]
order_reference:order reference
]
发布于 2021-03-09 12:01:14
答案由@xadm提供
在https://stackoverflow.com/a/41230015/6124657中突出显示的解决方案
var InputType = graphql.NewInputObject(
graphql.InputObjectConfig{
Name: "InputTypeName",
Fields: graphql.InputObjectConfigFieldMap{
"sub_field_one": &graphql.InputObjectFieldConfig{
Type: graphql.String,
},
"sub_field_two": &graphql.InputObjectFieldConfig{
Type: graphql.String,
},
},
},
)
在Args部分中,替换原始的NewObject(...)使用NewInputObject(...)
"billing_address": &graphql.ArgumentConfig{
Type: graphql.NewInputObject(
graphql.InputObjectConfig{
Name: "BillingAddress",
Fields: graphql.InputObjectConfigFieldMap{
"address_line_one": &graphql.InputObjectFieldConfig{
Type: graphql.String,
},
"address_line_two": &graphql.InputObjectFieldConfig{
Type: graphql.String,
},
...
},
},
),
},
这将生成包含子字段的地图
https://stackoverflow.com/questions/66506745
复制相似问题