石墨烯 Django "Must provide query string"
Graphene Django "Must provide query string"
我已经使用 Django 设置了一个 Graphene 服务器。当我 运行 通过 GraphiQL(网络客户端)查询时,一切正常。但是,当我从其他任何地方 运行 时,我收到错误消息:"Must provide query string."
我做了一些故障排除。 GraphiQL 使用 Content-Type: application/json
将 POST 数据发送到 GraphQL 服务器。这是我从 GraphiQL 的 Chrome 网络选项卡复制的请求正文:
{"query":"query PartnersQuery {\n partners{\n name\n url\n logo\n }\n}","variables":"null","operationName":"PartnersQuery"}
当我使用 Content-Type: application/json
将其复制到 Postman 时,我得到以下响应:
{
"errors": [
{
"message": "Must provide query string."
}
]
}
导致此问题的原因是什么?我没有对模式做任何疯狂的事情。只是按照石墨烯文档中的教程进行操作。还有什么会导致这样的问题?
查看示例应用并了解它们的工作方式,
例如
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())),
当 parse_body
无法解析传入数据时会引发此错误。我将从查看传递到此方法的数据并确保其类型正确开始。
例如multipart/form-data
部分天真的returnsrequest.POST
,可能需要覆盖处理,例如apollo-upload-client
发送的文件请求上传处理。
在我们的例子中,我们创建了一个视图,既需要登录又支持 apollo-upload-client
用例,它工作正常。
以下是我如何使用带有简单突变的石墨烯 Django 后端从 Postman 获得成功的响应:
- 将方法设置为 POST
- 将 URL 添加到您的 graphQL 端点,例如http://localhost:8000/api/
- 加一个header -- 键:"Content-Type",值:"application/json"
- 将 body 设置为 "raw"
- 将您的查询粘贴到 body window,例如
{"query":"{myModels {id}}","variables":"null","operationName":null}
这听起来很像你所做的,所以你一定很接近。
我遇到了和楼主 Gasim 完全一样的问题。研究 'graphiql.html' 中的代码,我发现他们正在将进入 body 的查询字符串转换为 URL 中的查询参数。因此,您最终会通过 Postman 发送 URL:
在 URL 中的查询字符串中精确复制 body 中的内容对我来说似乎是荒谬的,但这似乎是获得石墨烯服务器 return 有效响应。
这肯定是 bug/shortcoming 会被修复的吗?
罗伯特
我的代码中的问题是我 URL 没有正确设置 graphQL。我有以下内容:
url(r'^graphql/', GraphQLView.as_view())
正斜线是一个巨大的差异。删除它解决了问题。正确的做法是:
url(r'^graphql', GraphQLView.as_view())
当我尝试使用 POSTMAN
使用 graphQl
查询时,我遇到了同样的问题,
在 POSTMAN 中使用 json
类型发送 row
中的数据。
您必须像这样 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
在 django 上启用 graphine
url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=settings.DEBUG))),
执行一些查询并查看它是否正常工作
在 Chrome 浏览器上,转到 graphiQL 端点:http://localhost:8000/graphql? 在浏览器中打开“Developer Tools”并转到“Network”选项卡。
再次执行您的查询。现在它出现在请求列表中。现在 鼠标右键单击 并复制它“copy as 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
我已经使用 Django 设置了一个 Graphene 服务器。当我 运行 通过 GraphiQL(网络客户端)查询时,一切正常。但是,当我从其他任何地方 运行 时,我收到错误消息:"Must provide query string."
我做了一些故障排除。 GraphiQL 使用 Content-Type: application/json
将 POST 数据发送到 GraphQL 服务器。这是我从 GraphiQL 的 Chrome 网络选项卡复制的请求正文:
{"query":"query PartnersQuery {\n partners{\n name\n url\n logo\n }\n}","variables":"null","operationName":"PartnersQuery"}
当我使用 Content-Type: application/json
将其复制到 Postman 时,我得到以下响应:
{
"errors": [
{
"message": "Must provide query string."
}
]
}
导致此问题的原因是什么?我没有对模式做任何疯狂的事情。只是按照石墨烯文档中的教程进行操作。还有什么会导致这样的问题?
查看示例应用并了解它们的工作方式,
例如 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())),
当 parse_body
无法解析传入数据时会引发此错误。我将从查看传递到此方法的数据并确保其类型正确开始。
例如multipart/form-data
部分天真的returnsrequest.POST
,可能需要覆盖处理,例如apollo-upload-client
发送的文件请求上传处理。
在我们的例子中,我们创建了一个视图,既需要登录又支持 apollo-upload-client
用例,它工作正常。
以下是我如何使用带有简单突变的石墨烯 Django 后端从 Postman 获得成功的响应:
- 将方法设置为 POST
- 将 URL 添加到您的 graphQL 端点,例如http://localhost:8000/api/
- 加一个header -- 键:"Content-Type",值:"application/json"
- 将 body 设置为 "raw"
- 将您的查询粘贴到 body window,例如
{"query":"{myModels {id}}","variables":"null","operationName":null}
这听起来很像你所做的,所以你一定很接近。
我遇到了和楼主 Gasim 完全一样的问题。研究 'graphiql.html' 中的代码,我发现他们正在将进入 body 的查询字符串转换为 URL 中的查询参数。因此,您最终会通过 Postman 发送 URL:
在 URL 中的查询字符串中精确复制 body 中的内容对我来说似乎是荒谬的,但这似乎是获得石墨烯服务器 return 有效响应。
这肯定是 bug/shortcoming 会被修复的吗?
罗伯特
我的代码中的问题是我 URL 没有正确设置 graphQL。我有以下内容:
url(r'^graphql/', GraphQLView.as_view())
正斜线是一个巨大的差异。删除它解决了问题。正确的做法是:
url(r'^graphql', GraphQLView.as_view())
当我尝试使用 POSTMAN
使用 graphQl
查询时,我遇到了同样的问题,
在 POSTMAN 中使用 json
类型发送 row
中的数据。
您必须像这样 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
在 django 上启用 graphine
url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=settings.DEBUG))),
执行一些查询并查看它是否正常工作
在 Chrome 浏览器上,转到 graphiQL 端点:http://localhost:8000/graphql? 在浏览器中打开“Developer Tools”并转到“Network”选项卡。
再次执行您的查询。现在它出现在请求列表中。现在 鼠标右键单击 并复制它“copy as 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