Erro de validação mesmo com parâmetro passado ao executar a API do explorador de dados com Curl

Já examinei as respostas do fórum, mas ainda não consigo fazer funcionar. A função não aceita o parâmetro user_param que defini na consulta.

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

A consulta:

-- [params]
-- int :user_param

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

O 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];
//credenciais da 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 ) {
    // Lidar com erro, chamar curl_close( $ch ) e retornar.
	echo 'error';
	curl_close ($ch);
	return;
}

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

?>

Gerei o valor para $post_fields com e sem http_build_query, mas o parâmetro ainda não está sendo passado para o Data Explorer.

Isso funcionava há um mês com http_build_query e agora não funciona mais. O que estou esquecendo?

Atualização:
Tentei até passar o array manualmente e o erro continua o mesmo. Algo mudou recentemente no plugin?

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

Dê uma olhada em Como executar consultas do Data Explorer com a API do Discourse para detalhes sobre como o parâmetro params precisa ser configurado. Com base no código que você forneceu, parece que você está tentando passar o parâmetro user_param diretamente, em vez de incluí-lo em um parâmetro params. O primeiro exemplo de código no tópico que vinculei deve dar uma ideia de como configurar esse parâmetro.

Simon,

Li seu artigo sobre APIs, mas estou usando a função curl_setopt() para inserir os parâmetros. A função exige que eu use um array. Então, tentei o seguinte e está exibindo um erro no nível do fórum.

$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 os dados estão sendo passados agora, mas a saída não está sendo renderizada.

Oops

O software que comanda este fórum de discussão encontrou um problema inesperado. Pedimos desculpas pelo inconveniente.

Informações detalhadas sobre o erro foram registradas e uma notificação automática foi gerada. Vamos analisar o caso.

Nenhuma ação adicional é necessária. No entanto, se o erro persistir, você pode fornecer detalhes adicionais, incluindo passos para reproduzir o erro, publicando um tópico de discussão na categoria de feedback do site.

O que estou esquecendo?

Você pode simplificar a depuração do problema tentando primeiro fazer a chamada da API com um comando curl no terminal do seu computador. Se isso funcionar, você saberá que o problema está relacionado à forma como está criando a solicitação com curl_setopt.

Não esperaria que uma consulta ao Data Explorer via API causasse um erro 500 no servidor do seu site. Se você conseguir acessar o site, deverá encontrar detalhes sobre o que deu errado nos logs de erro do seu site (localizados em Admin / Logs / Logs de Erro.)

Consegui encontrar as informações, mas não consigo entendê-las.

MultiJson::ParseError (caractere inesperado (após ) na linha 1, coluna 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'

Em relação à sua primeira sugestão, estou trabalhando para entender como executar o Curl no prompt de comando.

1 curtida

Então, tentei executar o código no terminal e estou recebendo o seguinte erro:

curl: (3) URL com formato incorreto/ilegal ou URL ausente
curl: (3) URL com formato incorreto/ilegal ou URL ausente
curl: (3) URL com formato incorreto/ilegal ou URL ausente
curl: (3) URL com formato incorreto/ilegal ou URL ausente

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

Consegui executar a consulta no Data Explorer - screenshot.

Nos logs de erro, vejo o seguinte:

ActionDispatch::Http::MimeNegotiation::InvalidType ("%{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('90b3sfq9'" não é um 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'

Qualquer sugestão seria útil.