9

我已经使用 Django 设置了一个石墨烯服务器。当我通过 GraphiQL(网络客户端)运行查询时,一切正常。但是,当我从其他任何地方运行时,我会收到错误消息:“必须提供查询字符串。”

我做了一些故障排除。GraphiQL 将 POST 数据发送到 GraphQL 服务器Content-Type: application/json。这是我从 GraphiQL 的 Chrome 网络选项卡复制的请求正文:

{"query":"query PartnersQuery {\n  partners{\n    name\n    url\n    logo\n  }\n}","variables":"null","operationName":"PartnersQuery"}

当我将它复制到 Postman 时Content-Type: application/json,我得到以下响应:

{
  "errors": [
    {
      "message": "Must provide query string."
    }
  ]
}

这个问题的原因可能是什么?我没有对架构做过任何疯狂的事情。只是按照石墨烯文档中的教程进行操作。还有什么可能导致这样的问题?

4

7 回答 7

4

parse_body当无法解析传入数据时会引发此错误。我将从查看传递给此方法的数据开始,并确保其类型正确。

例如,该multipart/form-data部分天真地返回request.POST,可能需要将其覆盖以处理例如apollo-upload-client为文件上传处理而发送的请求。在我们的例子中,我们创建了一个既需要登录又支持apollo-upload-client用例的视图,它工作正常。

于 2017-06-07T18:07:05.280 回答
2

以下是我如何使用带有简单突变的石墨烯 Django 后端从 Postman 获得成功的响应:

  1. 将方法设置为 POST
  2. 将 URL 添加到您的 graphQL 端点,例如http://localhost:8000/api/
  3. 添加一个 header -- key: "Content-Type" , value: "application/json"
  4. 将主体设置为“原始”
  5. 将您的查询粘贴到正文窗口中,例如{"query":"{myModels {id}}","variables":"null","operationName":null}

这听起来很像你所做的,所以你必须接近。

于 2017-06-12T21:37:05.650 回答
2

当我尝试使用graphQl查询时遇到了同样的问题POSTMAN,在 POSTMAN 中row使用json类型发送数据。您必须像这样进行 json 数据 grapQl 查询和突变数据

查询命令:

{"query":"{user(id:902){id,username,DOB}}"}

突变命令:

{ "query": "mutation {createMutations(reviewer:36, comments:\"hello\",loan: 1659, approved: true ){id}}" }

       #commnent: String Type
       #data_id:Int Type
       #approved:Boolean Type
于 2018-04-26T12:52:39.720 回答
1

查看示例应用程序并查看它们的工作方式,

例如 https://github.com/mjtamlyn/graphene-tutorial 他们执行以下操作:

from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView

url(r'^explore', GraphQLView.as_view(graphiql=True)),
url(r'^graphql', csrf_exempt(GraphQLView.as_view())),
于 2017-06-05T12:24:21.450 回答
0

我遇到了与原始海报 Gasim 完全相同的问题。研究“graphiql.html”中的代码,我发现他们正在将进入body的查询字符串转换为 URL 中的查询参数。因此,您最终会通过 Postman 发送此 URL:

http://127.0.0.1:8000/graphql?query=%7B%0A%20%20allCategories%20%7B%0A%20%20%20%20edges%20%7B%0A%20%20%20%20 %20%20节点%20%7B%0A%20%20%20%20%20%20%20%20名称%0A%20%20%20%20%20%20%20%20成分%20%7B%0A %20%20%20%20%20%20%20%20%20%20edges%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20node %20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20名称%0A%20%20%20%20%20%20%20 %20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20 %20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D%0A

在我看来,在 URL 中精确复制查询字符串中的正文内容似乎是荒谬的,但这似乎是让 Graphene 服务器返回有效响应的唯一方法。

当然这是一个将被修复的错误/缺点?

罗伯特

于 2017-06-22T23:52:49.980 回答
0

在 django 上启用 graphine

  url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=settings.DEBUG))),

执行一些查询并查看它是否正常工作

在 Chrome 浏览器上,转到graphiQL端点:http://localhost:8000/graphql在浏览器中打开“开发者工具”并转到“网络”选项卡。

再次执行您的查询。现在它出现在请求列表中。现在鼠标右键单击它并复制它“复制为CURL ”。现在您可以将其复制粘贴到安装了 curl 的 linux 终端。或者就像在您的情况下,您可以尝试扣除那里的内容,并尝试在您的 IDE 中重用它,例如 Insomnia 或 Postman 等客户端。例如,您可能会发现与graphiQL enpoint 上的会话一起使用的授权最终不是您想要的……

curl 'http://localhost:8000/graphql?' -H 'Origin: http://localhost:8000' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,pl;q=0.8,de;q=0.7' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Cookie: _ga=GA1.1.1578283610.1528109563; _gid=GA1.1.920024733.1541592686; csrftoken=EGBeegFoyMVl8j1fQbuEBG587nOFP2INwv7Q0Ee6HeHHmsLOPUwRonzun9Y6pOjV; sessionid=4u9vngcnmjh927a9avpssvc4oq9qyqoe' -H 'Connection: keep-alive' -H 'X-CSRFToken: EGBeegFoyMVl8j1fQbuEBG587nOFP2INwv7Q0Ee6HeHHmsLOPUwRonzun9Y6pOjV' --data-binary '{"query":"{\n  allStatistics(projectId: 413581, first:25) {\n    pageInfo {\n      startCursor\n      endCursor\n      hasPreviousPage\n      hasNextPage\n    }\n    edges {\n      cursor\n      node {\n        id\n        clickouts\n        commissionCanc\n        commissionConf\n        commissionLeads\n        commissionOpen\n        eventDate\n        extractTstamp\n        hash\n        leads\n        pageviews\n        projectId\n        transactionsCanc\n        transactionsConf\n        transactionsOpen\n      }\n    }\n  }\n}\n","variables":null,"operationName":null}' --compressed
于 2018-11-08T14:24:13.123 回答
-1

我的代码中的问题是我为 graphQL 设置了不正确的 URL。我有以下内容:

url(r'^graphql/', GraphQLView.as_view())

正斜杠是一个巨大的差异。删除它解决了问题。正确的方法是:

url(r'^graphql', GraphQLView.as_view())
于 2017-07-15T15:38:01.093 回答