GraphQL 能否处理 XML 将单个项目数组转换为字典的响应?
Can GraphQL handle XML responses where single item arrays are converted to dictionaries?
我目前正在使用 GraphQL/Node/Express 服务器从另一个 API 检索数据。除了我收到的数据,我绝对无法访问其他 API。
我的问题是响应是 XML 并且某些字段应作为数组返回,但如果数组中只有一项,则作为对象(或字典)返回。
This blog post 更详细地解释了这个问题。
GraphQL 中是否有一种方法可以设计模式,如果它接收到定义为数组的 属性 的对象,它会将对象放入数组中?
例子
当前行为
<team>
<employee>
<name>Joe</name>
<surname>Bloggs</surname>
</employee>
<employee>
<name>Jane</name>
<surname>Doe</surname>
</employee>
</team>
上面的XML会转换成下面的JSON
{
team:{
employee:[
{
name:'Joe',
surname:'Bloggs'
},
{
name:'Jane',
surname:'Doe'
}
]
}
}
但如果只有一名员工
<team>
<employee>
<name>Joe</name>
<surname>Bloggs</surname>
</employee>
</team>
上面的XML会转换成下面的JSON,其中employee
变成一个对象而不是数组
{
team:{
employee:{
name:'Joe',
surname:'Bloggs'
}
}
}
是的,实现起来很容易
使用 Apollo,您可以定义解析器映射,用于解析您类型的所有字段和子字段,用于查询和变更。
在您的情况下,您可以为 Team
类型的特定字段 employee
编写一个解析器,这将确保 return 一个数组。
{
Team: {
employee(parentObject, args, context) {
const {employee} = parentObject
// you should probably handle the case when employee is null or undefined
return Array.isArray(employee) ? employee : [employee]
}
...
}
结果将是:
{
team: {
employee: [
{
name:'Joe',
surname:'Bloggs'
}
]
}
}
注意:您不必自己实现所有解析器功能。如果您没有为字段提供解析器函数,Apollo 将使用默认解析器。这通常意味着简单地return按原样计算值。
我目前正在使用 GraphQL/Node/Express 服务器从另一个 API 检索数据。除了我收到的数据,我绝对无法访问其他 API。
我的问题是响应是 XML 并且某些字段应作为数组返回,但如果数组中只有一项,则作为对象(或字典)返回。
This blog post 更详细地解释了这个问题。
GraphQL 中是否有一种方法可以设计模式,如果它接收到定义为数组的 属性 的对象,它会将对象放入数组中?
例子
当前行为
<team>
<employee>
<name>Joe</name>
<surname>Bloggs</surname>
</employee>
<employee>
<name>Jane</name>
<surname>Doe</surname>
</employee>
</team>
上面的XML会转换成下面的JSON
{
team:{
employee:[
{
name:'Joe',
surname:'Bloggs'
},
{
name:'Jane',
surname:'Doe'
}
]
}
}
但如果只有一名员工
<team>
<employee>
<name>Joe</name>
<surname>Bloggs</surname>
</employee>
</team>
上面的XML会转换成下面的JSON,其中employee
变成一个对象而不是数组
{
team:{
employee:{
name:'Joe',
surname:'Bloggs'
}
}
}
是的,实现起来很容易
使用 Apollo,您可以定义解析器映射,用于解析您类型的所有字段和子字段,用于查询和变更。
在您的情况下,您可以为 Team
类型的特定字段 employee
编写一个解析器,这将确保 return 一个数组。
{
Team: {
employee(parentObject, args, context) {
const {employee} = parentObject
// you should probably handle the case when employee is null or undefined
return Array.isArray(employee) ? employee : [employee]
}
...
}
结果将是:
{
team: {
employee: [
{
name:'Joe',
surname:'Bloggs'
}
]
}
}
注意:您不必自己实现所有解析器功能。如果您没有为字段提供解析器函数,Apollo 将使用默认解析器。这通常意味着简单地return按原样计算值。