如何调用graphql API

时间:2018-11-06 08:33:05

标签: ios graphql apollo

如何在视图控制器中调用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周围的值无效。}

它也可以在邮递员中正常工作并获得输出。任何人都可以帮助我找出解决方案。

1 个答案:

答案 0 :(得分:2)

这是您当前正在发送的文档:

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

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

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

其中括号表示可选元素,操作类型是querymutationsubscription中的一种,选择集是一个或多个包含在花括号中的字段。 / p>

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

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 } } }"