我使用Django设置了Graphene服务器 . 当我通过GraphiQL(Web客户端)运行查询时,一切正常 . 但是,当我从其他任何地方运行时,我收到错误:“必须提供查询字符串 . ”
我做了一些故障排除 . 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
将其复制到邮递员时,我收到以下回复:
{
"errors": [
{
"message": "Must provide query string."
}
]
}
这个问题的原因是什么?我没有对架构做过任何疯狂的事情 . 刚刚接受了石墨烯文档的教程 . 还有什么可以导致像这样的问题?
7 回答
结帐示例应用,看看他们是如何做的,
例如https://github.com/mjtamlyn/graphene-tutorial他们执行以下操作:
当
parse_body
无法解析传入数据时,会引发此错误 . 我是'd start there by looking at the data passed into this method and ensuring it'的正确类型 .例如,
multipart/form-data
部分天真地返回request.POST
,可能需要覆盖它以处理例如apollo-upload-client
为文件上载处理发送的请求 . 在我们的例子中,我们创建了一个视图,既要求登录又支持apollo-upload-client
用例,它工作正常 .以下是我使用带有简单变异的石墨烯Django后端从Postman获得成功响应的方法:
将方法设置为POST
将URL添加到graphQL endpoints ,例如http://localhost:8000/api/
添加一个 Headers - 键:"Content-Type",值:"application/json"
将正文设置为"raw"
将查询粘贴到正文窗口中,例如
{"query":"{myModels {id}}","variables":"null","operationName":null}
这听起来很像你所做的,所以你必须接近 .
当我尝试使用
POSTMAN
使用graphQl
查询时遇到了同样的问题,在POSTMAN中使用json
类型在row
中发送数据 . 你必须像这样制作json数据grapQl查询和突变数据Query Command:
Mutations Command:
我遇到了与原版海报Gasim完全相同的问题 . 研究'graphiql.html'中的代码我发现他们正在将查询字符串(进入正文)转换为URL中的查询参数 . 因此,您最终通过邮递员发送此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%20node%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20ingredients%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%20name%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服务器返回有效响应的唯一方法 .
当然这是一个将被修复的错误/缺点?
罗伯特
在django上启用graphine
执行一些查询,看它是否正常工作
在Chrome浏览器上,转到 graphiQL endpoints : http://localhost:8000/graphql? 打开“ Developer Tools " in browser and go to " Network ”标签 .
再次执行您的查询 . 现在它出现在请求列表中 . 现在 right mouse click 就可以了,并将其复制为“ copy as CURL ” . 现在你可以将strait复制粘贴到安装了curl的linux终端 . 或者在您的情况下,您可以尝试扣除那里的内容,并尝试在IDE中重用它,如Insomnia或Postman等客户端 . 例如,您可能会发现在 graphiQL enpoint上使用会话的授权最终不是您想要的...
我的代码中的问题是我为graphQL设置了不正确的URL . 我有以下内容:
正斜线是一个巨大的差异 . 删除它修复了问题 . 正确的方法是: