Validierungsfehler, obwohl Parameter beim Ausführen der Data Explorer API mit Curl übergeben wurden

Ich habe mich bereits die Forum-Antworten angesehen, aber es funktioniert immer noch nicht. Die Funktion akzeptiert den von mir im Query definierten Parameter user_param nicht.

Fehler: Array ( [success] => [errors] => Array ( [0] => DataExplorer::ValidationError: Fehlender Parameter user_param vom Typ int ) )

Der Query:

-- [params]
-- int :user_param

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

Der 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];
// API-Anmeldedaten,
$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 ) {
    // Fehler behandeln, curl_close( $ch ) aufrufen und zurückkehren.
	echo 'error';
	curl_close ($ch);
	return;
}

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

?>

Ich habe den Wert für $post_fields sowohl mit als auch ohne http_build_query generiert, aber der Parameter wird immer noch nicht an den Data Explorer übergeben.

Das hat vor einem Monat noch mit http_build_query funktioniert, jetzt aber nicht mehr. Was übersehe ich?

Update:
Ich habe sogar versucht, das Array manuell zu übergeben, aber der Fehler bleibt derselbe. Hat sich kürzlich etwas im Plugin geändert?

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

Werfen Sie einen Blick auf So führen Sie Data Explorer-Abfragen mit der Discourse-API aus, um Details dazu zu erhalten, wie der Parameter params gesetzt werden muss. Basierend auf dem von Ihnen bereitgestellten Code scheint es, als würden Sie versuchen, den Parameter user_param direkt zu übergeben, anstatt ihn in einem Parameter params zu enthalten. Das erste Codebeispiel im verlinkten Beitrag sollte Ihnen eine Vorstellung davon geben, wie dieser Parameter gesetzt wird.

Simon,

ich habe deinen Artikel über APIs gelesen, aber ich verwende die Funktion curl_setopt(), um die Parameter einzufügen. Die Funktion erfordert die Verwendung eines Arrays. Daher habe ich Folgendes versucht, was jedoch einen Forum-Fehler aufweist.

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

Es scheint, als würden die Daten jetzt übergeben, aber die Ausgabe wird nicht gerendert.

Ups

Die Software, die dieses Diskussionsforum betreibt, ist auf ein unerwartetes Problem gestoßen. Wir entschuldigen uns für die Unannehmlichkeiten.

Detaillierte Informationen zum Fehler wurden protokolliert und eine automatische Benachrichtigung generiert. Wir werden uns das ansehen.

Es sind keine weiteren Schritte erforderlich. Falls der Fehler jedoch weiterhin besteht, können Sie weitere Details bereitstellen, einschließlich der Schritte zur Reproduktion des Fehlers, indem Sie ein Diskussionsthema in der Feedback-Kategorie der Website veröffentlichen.

Was übersehe ich?

Vielleicht können Sie die Fehlersuche vereinfachen, indem Sie zunächst versuchen, den API-Aufruf über eine cURL-Anfrage direkt im Terminal Ihres Computers durchzuführen. Wenn das funktioniert, wissen Sie, dass das Problem mit der Art und Weise zusammenhängt, wie Sie die Anfrage mit curl_setopt erstellen.

Ich würde nicht erwarten, dass eine Data Explorer-Abfrage über die API einen 500-Fehler auf Ihrem Server verursacht. Wenn Sie auf die Website zugreifen können, finden Sie in den Fehlerprotokollen Ihrer Website (unter Admin / Protokolle / Fehlerprotokolle) Details darüber, was schiefgelaufen ist.

Ich konnte die Informationen zwar finden, aber sie verstehen ist mir nicht gelungen.

MultiJson::ParseError (unerwartetes Zeichen (nach ) an Zeile 1, Spalte 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'

Bezüglich deines ersten Vorschlags arbeite ich daran herauszufinden, wie man Curl in der Eingabeaufforderung ausführt.

1 „Gefällt mir“

Ich habe den Code im Terminal ausprobiert und erhalte folgende Fehlermeldung:

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

Ich kann die Abfrage im Data Explorer ausführen – Screenshot.

In den Fehlerprotokollen sehe ich Folgendes:

ActionDispatch::Http::MimeNegotiation::InvalidType ("%{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('90b3sfq9'" is not a valid MIME type)
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'

Jeder Hinweis wäre hilfreich.