如何调用graphql API

Posted

技术标签:

【中文标题】如何调用graphql API【英文标题】:How to call graphql API's 【发布时间】:2019-04-09 15:11:37 【问题描述】:

如何在视图控制器中调用 graphql API。我正在调用如下结构的 API

let url = URL(string: "http://xxxx.com/graphql")!

var request = URLRequest(url: url)
request.httpMethod = "POST"

let query = "query:mutation \n  signin(email: \"adc.inlove@gmail.com\", password: \"qwerty\") \n    result \n      token\n      firstName\n      lastName\n      profileImage\n      status\n    \n  \n\n"
let body = ["query": query]
request.httpBody = try! JSONSerialization.data(withJSONObject: body, options: [])
request.cachePolicy = .reloadIgnoringLocalCacheData

let task = URLSession.shared.dataTask(with: request, completionHandler:  data, _, error in
    if let error = error  print(error); return 
    guard let data = data else  print("Data is missing."); return 
    do 
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
        print(json)
     catch let e 
        print("Parse error: \(e)")
    
)
task.resume()`

但它显示错误为,

错误域=NSCocoaErrorDomain 代码=3840 “字符 0 周围的值无效。” UserInfo=NSDebugDescription=字符 0 周围的值无效。

而且它在邮递员中也能完美运行并获得输出。任何人请帮我找出解决方案。

【问题讨论】:

您的服务未提供正确的 JSON 是 GraphQL API 的类型,所以我觉得应该只能这样传递... 【参考方案1】:

这是您当前发送的文档:


  query:mutation  
    signin(email: "adc.inlove@gmail.com", password: "qwerty") 
      result 
        token
        firstName
        lastName
        profileImage
        status
      
    
  

这不是 GraphQL 文档的正确语法。根据规范,文档应具有以下格式:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

其中括号表示可选元素,操作类型是querymutationsubscription 之一,选择集是包含在一组大括号中的一个或多个字段。

如果省略操作类型,则假定文档为查询。这称为“查询速记”。所以给出一个有效的查询,如:

query SomeOperationName 
  users 
    name
  

以下是等价的:


  users 
    name
  

以上仅适用于查询,但不适用于突变。鉴于以上所有情况,您的文档有一组额外的花括号和无效的操作类型。至少,将其更改为:

mutation 
  signin (email: "adc.inlove@gmail.com", password: "qwerty") 
    result 
      token
      firstName
      lastName
      profileImage
      status
    
  

或者...

let query = "mutation  signin(email: \"adc.inlove@gmail.com\", password: \"qwerty\")  result  token firstName lastName profileImage status   "

【讨论】:

非常感谢......我不知道如何表达我的感谢。你救了我。我需要更多帮助,这对于正常的 API 调用来说是可以的,如果我必须这样做这与 apollo 方法 API.swift 文件始终是一个空文件,请您帮我找出我的项目出了什么问题。 我还没有使用过 Apollo ios,所以我不太确定。根据文档“因为 Apollo iOS 生成特定于查询的结果类型,API.swift 此时将大部分为空,除非您已经向目标目录添加了一些带有查询或突变的 .graphql 文件”。我将从这里的文档开始,然后从那里开始:apollographql.com/docs/ios/installation.html

以上是关于如何调用graphql API的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Java 应用程序调用 GraphQL 端点 [重复]

如何调用graphql API

如何在组件外调用 GraphQL

如何使用 graphql-tools 调用查询

如何扩展 GraphQL 调用的上下文对象?

如何在 Spring Boot + GraphQL Java 工具的上下文中执行对 GraphQL 的 Java 调用?