`DataExplorer::ValidationError: Missing parameter` 当通过 API 使用 [params] 运行 Data Explorer 查询时

Discourse API 在运行包含参数的数据浏览器查询时存在一个错误(以下两个查询从浏览器运行均正常)。

遵循 Run Data Explorer queries with the Discourse API 中的说明,并使用

-F 'params={\"group_id\":\"64\"}'

运行此查询(该查询有一个未设置默认值的参数)

-- [params]
-- int :group_id
select id, name from groups
where id = :group_id

会导致错误:{"success":false,"errors":["DataExplorer::ValidationError: Missing parameter group_id of type int"]}

当查询有一个设置了默认值的参数时,API 调用会成功,但结果 与通过 -F 'params= 提供的任何值都相同

-- [params]
-- int :group_id = 2
select id, name from groups
where id = :group_id
-F 'params={\"group_id\":\"64\"}'

并且它总是返回参数_默认值_的结果:{"success":true,"errors":[],"duration":0.2,"result_count":1,"params":{},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[2,"moderators"]]}

您使用的完整命令是什么?
您是否提供了 -X POST 以及所有必需的标头?

浏览器使用 API。如果这是 Discourse 的一个大问题,那不太可能。

来自 How to run Data Explorer queries with the Discourse API 的命令,包含 -X POST 和所有必需的标头。

这不是语法问题,如果您查看 OP 的最后一行,您会发现 curl 返回了成功,只是结果不正确。

Jay,我不明白这句话的意思。您是否尝试过使用 OP 中提供的最小示例来重现问题?


@michaeld, @pfaffman
我犹豫是否要写这部分,主要是因为我钦佩并尊重您为社区提供免费支持的奉献精神和专业知识,我以前曾多次受益于您的见解。但这次我感觉你们俩都没有仔细阅读报告的前几行(我非常小心,在发布到支持类别之前会进行彻底的研究和测试,并且我总是尝试包含_详细的重现步骤_)。

问题是,根据我的经验,当支持请求收到这样的回复时——在没有尝试使用提供的步骤实际重现问题的情况下就假定是用户错误(尤其是来自像您这样经验丰富的成员)——真正的用户问题就不太可能被 Discourse 团队发现。

另一方面,如果您的回复能够验证或否定_实际的重现步骤_,这将为该声明增加分量(或指向其他原因),从而更有可能吸引团队的注意并最终得到修复。

我知道,可能 99% 的情况只是用户未能阅读说明(我应该知道,我以前也遇到过这种情况)。但知道这一点,我们是不是不应该犯同样的错误,急于快速回答支持问题,而不是彻底地回答?

我感到惊讶,坦率地说,有点失望读到这个。我非常彻底地阅读了您的问题,并有以下观察:

  1. 您实际上没有提供完整且详细的重现步骤,因为您没有包含完整的命令行。

  2. 您只有在为参数设置默认值时才获得输出这一事实,使我怀疑 Discourse 没有看到您的参数名称/值对。

您认为命令行必须是正确的,因为您获得了输出,这种结论是错误的——它忽略了您没有获得与您提供的参数相关的输出,而是获得了与默认值相关的输出这一事实。

  1. 确实尝试过——并且无法——重现此问题。
curl -X POST "https://REDACTED/admin/plugins/explorer/queries/2/run" -H "Content-Type: multipart/form-data;" -H "Api-Key: REDACTED" -H "Api-Username: system" -F 'params={"group_id":"1"}'

{"success":true,"errors":[],"duration":0.3,"result_count":1,"params":{"group_id":"1"},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[1,"admins"]]}

这三个观察使我向您询问命令行中的一个细节,因为我正在考虑哪些情况会导致 Discourse 看不到该参数,并且我确信这是一个语法问题。

输入错别字或犯错误并非只针对没有经验的用户。我每天都会犯一些微小的错误。

3 个赞

迈克尔(和杰伊),请接受我的道歉,我曾以为你没有真正执行重现步骤,我不该那样想!我以后会更小心,不会再做这样的假设。

希望你仍然愿意忍耐我:我使用了和你一样的 curl 命令(这次我actually复制了你的,以确保万无一失),结果如下:

{"success":true,"errors":[],"duration":0.2,"result_count":1,"params":{},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[2,"moderators"]]}

和你提供的进行比较

{"success":true,"errors":[],"duration":0.3,"result_count":1,"params":{"group_id":"1"},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[1,"admins"]]}

问题立刻显现:输出中的 params":{} 对比 \"params\":{\"group_id\":\"1\"},这使得你的分析是正确的:我的服务器没有正确识别/处理 -F 'params={\"group_id\":\"1\"}'

现在我看到了你推理的详细步骤,我完全理解你为什么会假设是语法错误(我真希望我能在发帖前读懂你的心思 :blush:)。但既然我现在使用了和你完全一样的语法,那现在就不可能是语法错误了吧?

服务器是最新版本。你认为可能是什么问题?

[编辑]:在另一个标准的独立安装服务器 2.9.0.beta3 (8040b95e8c) 上也遇到了同样的问题。第一个服务器是 2.9.0.beta3 (0f7b9878ff)

除非这是某个奇怪的 curl 问题,否则我束手无策。

curl 7.79.1 (Windows) libcurl/7.79.1 Schannel
Release-Date: 2021-09-22
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
2 个赞

Windows 不识别那些单引号。因此,您必须使用常规双引号并用反斜杠对其进行转义。

使用此:

-F params={"group_id":"1"}

(不要复制粘贴此内容,因为 iOS 弄乱了引号)

3 个赞

我现在感觉真像个傻瓜 :rofl:

谢谢 Michael,你名副其实!我再也不会怀疑你了。

4 个赞

我没有。如果你说 OP 是错的,那么我的评论就没有帮助。抱歉。

哦,我现在看到 Michael 的回复了。确实,正确处理引用和转义比想象中要困难得多。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.