API를 통해 [params]로 Data Explorer 쿼리를 실행할 때 `DataExplorer::ValidationError: Missing parameter` 오류가 발생합니다

Discourse API에는 매개변수를 포함하는 Data Explorer 쿼리를 실행할 때 버그가 있습니다(아래 두 쿼리는 브라우저에서 실행하면 정상적으로 동작합니다).

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를 사용합니다. 당신이 설명하고 있는 것이 큰 if 문(논리)일 가능성은 낮습니다.

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가 매개변수를 인식하지 못하는 상황을 고려하던 중, 이것이 실제로 구문 문제라고 확신하여 커맨드 라인에 대한 세부 사항을 요청했습니다.

오타나 실수를 하는 것은 경험 없는 사용자만의 특권이 아닙니다. 저도 매일 사소한 실수를 합니다.

Michael(과 Jay), 제 사과를 받아주세요. 여러분이 실제로 재현 단계를 수행하지 않은 것이라고 가정했는데, 그런 식으로 생각해서는 안 되었습니다! 앞으로는 이런 식으로 단정하지 않도록 더 주의하겠습니다.

여전히 제게 인내심을 가져주실 것 같아 기쁩니다: 여러분이 사용하신 것과 완전히 동일한 curl 명령을 사용했습니다(이번에는 100% 확실하도록 여러분의 것을 그대로 복사했습니다). 그 결과물은 다음과 같습니다:

{"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

Windows는 이러한 단일 따옴표를 인식하지 못합니다. 따라서 일반 이중 따옴표를 사용하고 역슬래시로 이스케이프해야 합니다.

다음과 같이 사용하세요:

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

(iOS에서 따옴표가 깨질 수 있으므로 복사해서 붙여넣지 마세요)

아, 이제 정말 바보 같네요 :rofl:

마이클, 감사합니다. 당신의 칭호를 정말로 잘 소화해내시는군요! 이제 더 이상 당신을 의심하지 않겠습니다.

아니요. OP가 틀렸다고 말씀하시는 거라면 제 댓글은 도움이 되지 않겠네요. 죄송합니다.

아, 그리고 마이클의 답변을 이제야 확인했습니다. 따옴표와 이스케이프를 올바르게 처리하는 것이 생각보다 훨씬 더 어렵다는 사실에 동의합니다.