Erreur de validation même lorsque le paramètre est passé lors de l'exécution de l'API Data Explorer avec Curl

J’ai consulté les réponses sur le forum, mais je n’arrive toujours pas à faire fonctionner cela. La fonction refuse d’accepter le paramètre user_param que j’ai défini dans la requête.

Erreur : Array ( [success] => [errors] => Array ( [0] => DataExplorer::ValidationError: Paramètre manquant user_param de type int ) )

La requête :

-- [params]
-- int :user_param

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

Le code :

<?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];
//identifiants 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 ) {
    // Gérer l'erreur, appeler curl_close( $ch ) et retourner.
	echo 'erreur';
	curl_close ($ch);
	return;
}

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

?>

J’ai généré la valeur pour $post_fields avec et sans http_build_query, mais le paramètre n’est toujours pas transmis à Data Explorer.

Cela fonctionnait il y a un mois avec http_build_query et maintenant cela ne fonctionne plus. Qu’est-ce que je rate ?

Mise à jour :
J’ai même essayé de passer le tableau manuellement et j’obtiens toujours la même erreur. Quelque chose a-t-il changé récemment dans le plugin ?

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

Consultez Comment exécuter des requêtes Data Explorer avec l’API Discourse pour plus de détails sur la façon dont le paramètre params doit être configuré. D’après le code que vous avez fourni, il semble que vous essayiez de transmettre le paramètre user_param directement au lieu de l’inclure dans un paramètre params. Le premier exemple de code dans le sujet que j’ai lié devrait vous donner une idée de la manière de configurer ce paramètre.

Simon,

J’ai lu ton article sur les API, mais j’utilise la fonction curl_setopt() pour insérer les paramètres. Cette fonction exige que j’utilise un tableau. J’ai donc essayé ce qui suit, mais cela affiche une erreur au niveau du forum.

$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);

Il semble que les données passent maintenant, mais la sortie n’est pas affichée.

Oups

Le logiciel qui alimente ce forum de discussion a rencontré un problème inattendu. Nous nous excusons pour la gêne occasionnée.

Des informations détaillées sur l’erreur ont été consignées et une notification automatique a été générée. Nous allons l’examiner.

Aucune action supplémentaire n’est nécessaire. Cependant, si l’erreur persiste, vous pouvez fournir des détails supplémentaires, y compris les étapes pour reproduire l’erreur, en publiant un sujet de discussion dans la catégorie « Retour d’information » du site.

Qu’est-ce que je rate ?

Vous pourriez simplifier le débogage du problème en essayant d’abord d’effectuer l’appel API avec une requête curl depuis le terminal de votre ordinateur. Si cela fonctionne, vous saurez que le problème est lié à la façon dont vous créez la requête avec curl_setopt.

Je ne m’attendrais pas à ce qu’une requête Data Explorer via l’API provoque une erreur 500 sur le serveur de votre site. Si vous pouvez accéder au site, vous devriez trouver des détails sur ce qui a mal tourné dans les journaux d’erreurs de votre site (trouvés dans Admin / Journaux / Journaux d’erreurs).

J’ai réussi à trouver les informations, mais je n’arrive pas à les interpréter.

MultiJson::ParseError (caractère inattendu (après ) à la ligne 1, colonne 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'

Concernant votre première suggestion, je travaille actuellement sur la façon d’exécuter Curl dans l’invite de commande.

1 « J'aime »

J’ai donc essayé le code dans le terminal et je rencontre l’erreur suivante :

curl: (3) URL utilisant un format incorrect/illégal ou URL manquante
curl: (3) URL utilisant un format incorrect/illégal ou URL manquante
curl: (3) URL utilisant un format incorrect/illégal ou URL manquante
curl: (3) URL utilisant un format incorrect/illégal ou URL manquante

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”}’

Je parviens à exécuter la requête dans l’explorateur de données - capture d’écran.

Dans les journaux d’erreurs, je vois ce qui suit :

ActionDispatch::Http::MimeNegotiation::InvalidType ("%{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('90b3sfq9'" n'est pas un type MIME valide)
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'

Toute suggestion serait la bienvenue.