Errore di convalida anche quando il parametro viene passato durante l'esecuzione dell'API data explorer con Curl

Ho esaminato le risposte sul forum, ma non riesco ancora a far funzionare la cosa. La funzione non accetta il parametro user_param che ho definito nella query.

Errore: Array ( [success] => [errors] => Array ( [0] => DataExplorer::ValidationError: Parametro mancante user_param di tipo int ) )

La query:

-- [params]
-- int :user_param

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

Il codice:

<?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];
//credenziali 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 ) {
    // Gestisci l'errore, chiama curl_close( $ch ) e restituisci.
	echo 'errore';
	curl_close ($ch);
	return;
}

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

?>

Ho generato il valore per $post_fields sia con che senza http_build_query, ma il parametro non viene comunque passato a Data Explorer.

Funzionava un mese fa con http_build_query e ora non funziona più. Cosa mi sto perdendo?

Aggiornamento:
Ho persino provato a passare l’array manualmente e ricevo lo stesso errore. Qualcosa è cambiato di recente nel plugin?

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

Dai un’occhiata a Come eseguire query di Data Explorer con l’API di Discourse per i dettagli su come impostare il parametro params. In base al codice che hai fornito, sembra che tu stia cercando di passare il parametro user_param direttamente invece di includerlo in un parametro params. Il primo esempio di codice nell’argomento a cui ho linkato dovrebbe darti un’idea su come impostare quel parametro.

Simon,

Ho letto il tuo articolo sulle API, ma sto usando la funzione curl_setopt() per inserire i parametri. La funzione richiede l’uso di un array. Quindi ho provato quanto segue e mi sta restituendo un errore a livello di 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);

Sembra che i dati vengano inviati correttamente, ma l’output non viene visualizzato.

Oops

Il software che gestisce questo forum di discussione ha incontrato un problema imprevisto. Ci scusiamo per l’inconveniente.

Sono state registrate informazioni dettagliate sull’errore e generata una notifica automatica. Ne daremo un’occhiata.

Non è necessaria alcuna ulteriore azione. Tuttavia, se il problema persiste, puoi fornire ulteriori dettagli, inclusi i passaggi per riprodurre l’errore, pubblicando un argomento di discussione nella categoria feedback del sito.

Cosa mi sto perdendo?

Potresti semplificare il debug del problema tentando prima di effettuare la chiamata API con una richiesta curl dal terminale del tuo computer. Se riesci a farla funzionare, saprai che il problema è legato a come stai creando la richiesta con curl_setopt.

Non mi aspetterei che l’esecuzione di una query di Data Explorer tramite l’API causi un errore 500 sul server del tuo sito. Se riesci ad accedere al sito, dovresti trovare i dettagli su cosa è andato storto nei log degli errori del sito (trovati in Amministrazione / Log / Log degli errori).

Sono riuscito a trovare le informazioni, ma non riesco a capirle.

MultiJson::ParseError (carattere inaspettato (dopo ) alla riga 1, colonna 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'

Riguardo al tuo primo suggerimento, sto cercando di capire come eseguire Curl sul prompt dei comandi.

1 Mi Piace

Quindi ho provato il codice nel terminale e ricevo il seguente errore:

curl: (3) URL con formato errato/illegale o URL mancante
curl: (3) URL con formato errato/illegale o URL mancante
curl: (3) URL con formato errato/illegale o URL mancante
curl: (3) URL con formato errato/illegale o URL mancante

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

Riesco a eseguire la query nell’esploratore dei dati - screenshot.

Nei log degli errori vedo quanto segue:

ActionDispatch::Http::MimeNegotiation::InvalidType ("%{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('90b3sfq9'" non è un tipo MIME valido)
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'

Qualsiasi suggerimento sarebbe utile.