CurlでData Explorer APIを実行中にパラメータを渡しても検証エラーが発生する

フォーラムの回答を確認しましたが、まだ動作させることができません。定義した user_param パラメータを関数が受け付けてくれません。

エラー:
Array ( [success] => [errors] => Array ( [0] => DataExplorer::ValidationError: Missing parameter user_param of type int ) )

クエリ:

-- [params]
-- int :user_param

SELECT Count(likes_received) total_likes_received 
from user_stats us
where us.user_id = :user_param

コード:

<?php global $post;

$current_user_id = get_current_user_id();

$user_discourse_id = (int)get_user_meta($current_user_id,'discourse_sso_user_id')[0];
// API 認証情報
$api_key = 'key';
$api_username = 'name';
$post_fields = array(
    'user_param' => $user_discourse_id,
);

$headers = array("Content-Type: multipart/form-data;","Api-Key: $api_key","Api-Username: $api_username",);
$url = 'https://domain/admin/plugins/explorer/queries/9/run';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_fields );

$result = curl_exec( $ch );
if ( curl_errno( $ch ) !== 0 ) {
    // エラー処理、curl_close( $ch ) を呼び出してリターン
    echo 'error';
    curl_close ($ch);
    return;
}

curl_close( $ch );
$decoded_result = json_decode( $result, true );
print_r($decoded_result);

?>

http_build_query を使用する場合と使用しない場合で $post_fields の値を生成しましたが、パラメータが Data Explorer に渡されないままです。

1 ヶ月前までは http_build_query で動作していましたが、現在は機能しません。何が足りないのでしょうか?

更新:
配列を手動で渡す試みもしましたが、同じエラーになります。プラグインに最近変更があったのでしょうか?

curl_setopt( $ch, CURLOPT_POSTFIELDS, array('user_param'=>'25'));
curl_setopt( $ch, CURLOPT_POSTFIELDS, array('user_param' => 25));

How to run Data Explorer queries with the Discourse API をご覧ください。params パラメータの設定方法についての詳細が記載されています。提供されたコードから判断すると、user_param パラメータを直接渡そうとしているようですが、これは params パラメータ内に含める必要があります。リンクしたトピックの最初のコード例を参考に、パラメータの設定方法を確認してください。

サイモン、

API に関する記事を確認しましたが、パラメータの挿入には curl_setopt() 関数を使用しています。この関数は配列を必要とするため、以下のように試してみましたが、フォーラムレベルのエラーが表示されてしまいます。

$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_POSTFIELDS, array('params' => array('user_param' => 25)));

$result = curl_exec( $ch );
print_r($result);

データは渡されているようですが、出力がレンダリングされません。

Oops

このディスカッションフォーラムを動かしているソフトウェアで予期せぬ問題が発生しました。ご迷惑をおかけして申し訳ありません。

エラーの詳細情報はログに記録され、自動通知も生成されました。確認いたします。

追加の対応は不要ですが、もしエラーが継続する場合は、エラーを再現するための手順などを含めた詳細情報を、サイトのフィードバックカテゴリに投稿してご提供ください。

何が不足しているのでしょうか?

まず、お使いのコンピューターのターミナルから cURL リクエストで API 呼び出しを試みれば、問題のデバッグを簡略化できるかもしれません。それが動作すれば、問題は curl_setopt を使用してリクエストを作成する方法に関連していることがわかります。

API を介して Data Explorer クエリを実行しても、あなたのサイトのサーバーで 500 エラーが発生するとは思えません。サイトにアクセスできる場合、何かが間違っていたかの詳細は、サイトのエラーログ(Admin / Logs / Error Logs にあります)で確認できるはずです。

情報は見つかったのですが、その内容を理解できません。

MultiJson::ParseError (unexpected character (after ) at line 1, column 1 [parse.c:769])
app/controllers/application_controller.rb:395:in `block in with_resolved_locale'
app/controllers/application_controller.rb:395:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:355:in `call'
config/initializers/008-rack-cors.rb:25:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:177:in `call'

最初の提案については、コマンドプロンプトで Curl を実行する方法を調べています。

「いいね!」 1

ターミナルでコードを実行したところ、以下のエラーが発生しました:

curl: (3) URL using bad/illegal format or missing URL
curl: (3) URL using bad/illegal format or missing URL
curl: (3) URL using bad/illegal format or missing URL
curl: (3) URL using bad/illegal format or missing URL

root@Discourse-for-Prowess:~# curl -X POST “https://domain/admin/plugins/explorer/queries/9/run”-H “Content-Type:multipart/form-data;”-H “Api-key:12345”-H “Api-username:username”-F ‘params={“user_param”:“25”}’

データエクスプローラーではクエリを実行できます - スクリーンショット

エラーログには以下が表示されています:

ActionDispatch::Http::MimeNegotiation::InvalidType ("%{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('90b3sfq9'" は有効な MIME タイプではありません)
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:353:in `call'
config/initializers/008-rack-cors.rb:25:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:177:in `call'

ご助言があれば幸いです。