Error de validación incluso cuando se pasa el parámetro al ejecutar la API de exploración de datos con Curl

He revisado las respuestas del foro, pero aún no logro que funcione. La función no acepta el parámetro user_param que he definido en la consulta.

Error: Array ( [success] = > [errors] = > Array ( [0] = > DataExplorer::ValidationError: Falta el parámetro user_param de tipo int ) )

La consulta:

-- [params]
-- int :user_param

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

El código:

<?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];
//credenciales de la 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 ) {
    // Manejar error, llamar a curl_close( $ch ) y retornar.
    echo 'error';
    curl_close ($ch);
    return;
}

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

?>

He generado el valor para $post_fields tanto con como sin http_build_query, pero el parámetro sigue sin enviarse al Data Explorer.

Esto funcionaba hace un mes con http_build_query y ahora no. ¿Qué estoy omitiendo?

Actualización:
Incluso intenté pasar el array manualmente y sigue dando el mismo error. ¿Ha cambiado algo recientemente en el plugin?

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

Consulta Cómo ejecutar consultas de Data Explorer con la API de Discourse para obtener detalles sobre cómo debe configurarse el parámetro params. Según el código que proporcionaste, parece que estás intentando pasar el parámetro user_param directamente en lugar de incluirlo dentro de un parámetro params. El primer ejemplo de código en el tema que enlacé debería darte una idea de cómo configurar ese parámetro.

Simon,

He revisado tu artículo sobre las APIs, pero estoy utilizando la función curl_setopt() para insertar los parámetros. Esta función requiere que use un array. Así que he probado lo siguiente y me está mostrando un error a nivel de foro:

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

Parece que los datos se están enviando ahora, pero la salida no se está renderizando.

¡Vaya!

El software que impulsa este foro de discusión ha encontrado un problema inesperado. Pedimos disculpas por las molestias.

Se ha registrado información detallada sobre el error y se ha generado una notificación automática. Lo revisaremos.

No es necesario tomar ninguna medida adicional. Sin embargo, si el error persiste, puedes proporcionar detalles adicionales, incluidos los pasos para reproducir el error, publicando un tema de discusión en la categoría de comentarios del sitio.

¿Qué es lo que me estoy perdiendo?

Podrías simplificar la depuración del problema intentando primero realizar la llamada a la API con una solicitud curl desde la terminal de tu computadora. Si logras que funcione, sabrás que el problema está relacionado con la forma en que estás creando la solicitud con curl_setopt.

No esperaría que realizar una consulta de Data Explorer a través de la API provocara un error 500 en el servidor de tu sitio. Si puedes acceder al sitio, deberías encontrar detalles sobre lo que ha salido mal en los registros de errores de tu sitio (en Administración / Registros / Registros de errores).

Logré encontrar la información, pero no puedo entenderla.

MultiJson::ParseError (carácter inesperado (después de ) en la línea 1, columna 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'

En cuanto a tu primera sugerencia, estoy trabajando en averiguar cómo ejecutar Curl en el símbolo del sistema.

1 me gusta

Así que probé el código en la terminal y obtuve el siguiente error:

curl: (3) URL con formato incorrecto/ilegal o URL faltante
curl: (3) URL con formato incorrecto/ilegal o URL faltante
curl: (3) URL con formato incorrecto/ilegal o URL faltante
curl: (3) URL con formato incorrecto/ilegal o URL faltante

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

Puedo ejecutar la consulta en el explorador de datos - captura de pantalla.

En los registros de error veo lo siguiente:

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

Cualquier sugerencia sería de gran ayuda.