将 Graphql 查询作为 JSON 字符串传递时收到意外的令牌错误

Posted

技术标签:

【中文标题】将 Graphql 查询作为 JSON 字符串传递时收到意外的令牌错误【英文标题】:Receiving Unexpected Token Error When Passing Graphql query as JSON string 【发布时间】:2017-01-25 19:39:06 【问题描述】:

提前感谢您的帮助。我正在使用在 java 中的 testng 上放心测试 GRAPHQL API。

我正在尝试将伪装成 JSON 的 agraphQL 对象作为帖子发送,但是在尝试将字符串打包为 JSON 对象时,我收到以下错误:

SyntaxError: Unexpected token B<br> &nbsp; &nbsp;at Object.parse (native)<br> &nbsp; &nbsp;at parse (/app/node_modules/body-parser/lib/types/json.js:88:17)<br> &nbsp; &nbsp;at /app/node_modules/body-parser/lib/read.js:116:18<br> &nbsp; &nbsp;at invokeCallback (/app/node_modules/raw-body/index.js:262:16)<br> &nbsp; &nbsp;at done (/app/node_modules/raw-body/index.js:251:7)<br> &nbsp; &nbsp;at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:307:7)<br> &nbsp; &nbsp;at emitNone (events.js:80:13)<br> &nbsp; &nbsp;at IncomingMessage.emit (events.js:179:7)<br> &nbsp; &nbsp;at endReadableNT (_stream_readable.js:913:12)<br> &nbsp; &nbsp;at _combinedTickCallback (internal/process/next_tick.js:74:11)<br> &nbsp; &nbsp;at process._tickDomainCallback (internal/process/next_tick.js:122:9)

我要创建的 JSON 对象在这里:

"\"query\":\"marketBySlug(slug: \"Boston\") countryCode\""

我发现我的问题是将波士顿标识为字符串的转义引号破坏了内部构造的 Graphql 查询字符串,但我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

试试这个:

"\"query\":\"marketBySlug(slug: \\\"Boston\\\") countryCode\""

【讨论】:

【参考方案2】:

您应该使用参数化查询,而不是弄乱字符串和转义。您的代码将如下所示:

String query =
        "query MarketBySlug($slug: String!) \n" +
        "  marketBySlug(slug: $slug) \n" +
        "    countryCode\n" +
        "  \n" +
        "";

    Map<String, Object> variables = new HashMap<>();
    variables.put("slug", slug);

    given()
    .body(new QueryDto(query, variables))
    .when()
    .post("/graphql")
    .then()
    .contentType(JSON)
    .statusCode(HttpStatus.OK.value())
    .body("data.marketBySlug.countryCode", equalTo(countryCode));

QueryDto 只是一个简单的 dto,包含两个字段(查询和变量),setter 和 getter。

【讨论】:

以上是关于将 Graphql 查询作为 JSON 字符串传递时收到意外的令牌错误的主要内容,如果未能解决你的问题,请参考以下文章

Java在输入字符串中传递\ - Java Graphql Json

GraphQL 通过将其作为解析参数之一传递来查询数据库

GraphQL - 将枚举值作为参数直接传递给突变?

如何通过 AWS AppSync 客户端将保存字符串的变量传递给 GraphQL 查询?

当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误

AppSync,使用 graphql-tag 将数组作为输入参数传递