gpt4 book ai didi

javascript - GraphQL(Apollo)如何在参数中传递数据结构?

转载 作者:行者123 更新时间:2023-11-30 20:44:04 27 4
gpt4 key购买 nike

我想用很多输入参数进行查询:

 apollo_client.mutate({mutation: gql
`mutation mutation($title: String!, $caption: String!, $id: Int!){
mutatePmaHome(pmaData: {id:$id, title: $title, caption: $caption}) {
pma{
title
caption
}
}
}`,
variables: {
title: this.state.title,
caption: this.state.caption,
id: this.state.id
},
}).then(console.log);

这是我传递简单数据结构(Int,String)时查询的样子但我的问题是:如何在突变查询中传递字典或对象。我不知道如何输入它。

graphQL 的文档说我必须创建一个输入对象。但是我在 js 和 apollo 上,所以我怎样才能在我的查询中传递字典而不是键入所有数据(这里是 3,但它可以是 10 到 20)。我想要一种带有输入类型字段的更简洁的方法,但我找不到一个示例。

谢谢

最佳答案

swift 5.1、 Apollo 0.21.0

字典中的键和值需要遵守 Apollo JSONEncodable 协议(protocol):

public protocol JSONEncodable: GraphQLInputValue {
var jsonValue: JSONValue { get }
}

您需要遍历 Dictionary 并返回带有 .jsonValue(JSONEncodable 协议(protocol))的每个对象。

[String : Any?] 与 [String : String]

如果将 [String : String] 的字典传递给 Apollo,它将自动工作,因为 String 符合 JSONEncodable 协议(protocol)。 key 和 value 都是 String 类型。

JSON 通常在 Swift 中表示为 [String : Any?],这意味着键必须是字符串,但值可以是任何对象(Array、Bool、Double、Null、String、Dictionary)。

因为Apollo不知道Any对象是什么,所以会引起SIGABRT。这是因为该值可能是您编写的不兼容 JSON 的自定义类。

您必须将 Any 对象转换为符合 JSONEncodable 协议(protocol)的类。

由于 [String : Any?] 默认情况下不能定义 Any 对象,通用 JSON 库通过创建一个新类来表示 JSON 数据来实现这一点。

下面的示例将 JSONEncodable 协议(protocol)扩展到 GenericJSON 类,以确保该值符合 Apollo 变更所需的 JSONEncodable 协议(protocol)。

构建遵循 JSONEncodable 协议(protocol)的字典

  1. 将通用 JSON 库添加到您的 pod 文件中:

https://github.com/zoul/generic-json-swift

pod 'GenericJSON'

  1. 导入 GenericJSON 库并在某些 ApolloExtensions.swift 文件中为您的自定义 JSON GraphQL 标量 创建一个别名。此别名将映射到 GenericJSON 库:
import GenericJSON

// CUSTOM JSON SCALAR

public typealias MyJsonScalar = JSON
  1. ApolloExtensions.swift 文件中,为 GenericJSON JSON 添加一个 JSONEncodable 扩展:
extension JSON: JSONEncodable {

public var jsonValue: JSONValue {

if self.objectValue != nil {

return jsonObject as JSONObject

}

if self.arrayValue != nil {

var array : Array<JSONEncodable> = []

for obj in self.arrayValue! {

if obj.arrayValue != nil {

array.append(obj.jsonValue as! Array<JSONEncodable>)

} else if obj.objectValue != nil {

array.append(obj.jsonValue as! JSONObject)

} else {

array.append(obj.jsonValue as! JSONEncodable)

}

}

return array as Array<JSONEncodable>

}

if self.stringValue != nil {

return self.stringValue! as String

}

if self.doubleValue != nil {

return self.doubleValue! as Double

}

if self.boolValue != nil {

return self.boolValue! as Bool

}

if self.isNull {

return "" as String

}

return "" as String

}

public var jsonObject: JSONObject {

var jsonObject : JSONObject = JSONObject(minimumCapacity: self.objectValue!.count)

for (key, value) in self.objectValue! {

if value.arrayValue != nil {

jsonObject[key] = value.jsonValue as! Array<JSONEncodable>

} else if value.objectValue != nil {

jsonObject[key] = value.jsonValue as! JSONObject

} else {

jsonObject[key] = value.jsonValue as! JSONEncodable

}

}

return jsonObject

}

}
  1. 从您的字典中创建一个 JSON 对象并将其传递给您的 GraphQL 突变:
func createJSONDictionary() {

let myDictionary : [String: Any?] = ["foo" : "foo", "bar" : 2]

do {

let jsonData : Data = try JSONSerialization.data(withJSONObject: myDictionary, options: [])

if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String : Any?] {

let json: JSON = try JSON(jsonObject)

self.myGraphQLMutation(json: json)

} else {

// casting error

}

} catch {

// json error

}

}

func myGraphQLMutation(json: JSON) {

// apollo

let apollo : ApolloClient = ApolloHelper.shared.client

// myMutation

let myMutation = MyMutation(json: json)

// perform

apollo.perform(mutation: myMutation, queue: DispatchQueue.global()) { result in

switch result {

case .success(let graphQLResult):

// Deal with GraphQLResult and its data and/or errors properties here

break

case .failure(let error):

// deal with network errors here

return

}

}

}

关于javascript - GraphQL(Apollo)如何在参数中传递数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48932332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com