Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Re:dashのAPI(検索/登録/編集/更新)をPHPでたたく

概要

PHPクライアントでググってみると一応あるにはあるがメンテされてないっぽいし、使いたいAPIについて機能がなかったので(登録、更新系のAPI)、自作してみた備忘録。

資料がほとんどなかったので、直接コードを読んだりしました。

以下から追う。

https://github.com/getredash/redash/blob/8b73a2b135aed8fcbca139380a959b9222ae0080/redash/handlers/api.py#L40

参考: https://qiita.com/ubonsa/items/9a7f4f1d020af88d70c4

追記

適当にまとめて公開しました。

composerから使えます。

# install
composer.json

{
    "require": {
        "sakatuki/redash-api-cli": "dev-master"
    }
}

# how to use
$queryId = 1;
$redashApiCli = new RedashApiClient(
    'https://your-redash',
    'your api key'
);
$apiQueries =  new RedashApiQueries($redashApiCli);
$data = $apiQueries->getQuery($queryId);

注意

以下で記しているのは実際に利用したコードではなく、そこから抽出したものなので、実行してみたらエラー出たりするかも。大筋では間違ってないので勘弁して。

利用してみるAPI

  • GET : /api/queries/search
  • POST: /api/queries
  • POST: /api/queries/{query_id}
  • POST: /api/queries/{query_id}/refresh

必要なもの

  • API Key
  • PHP環境
  • めげない心

認証編

API Keyやら実行環境やらを用意したらあとはコードを書くだけ!

認証には、getパラメータにapi_keyを含める方法と、リクエストヘッダに含める方法があるようです。

getパラメータに含める方は、単にapi_keyとして送ればok。

リクエストヘッダに入れて送る方法を調べてみると、サンプルコードは見つかったけど公式のドキュメントっぽいのがなかった。直接コードを読んだら以下のように送ればいいらしい。

$client = new \GuzzleHttp\Client(
    [
        'base_uri' => 'http://your-redash.jp/api/queries',
        'headers' =>[
            'Authorization' => 'Key yourapikey',
        ]
    ]
);
// 検索api
$client->get('/api/queries/search', [
    'query' => [
        'q' => 'hello wolod'
    ]
]);

検索編 - /api/queries/search

検索はqに検索したい文字列を入れれば良いよう。name(クエリタイトル)から検索してくれる。

$response = $client->get('/api/queries/search', [
    'query' => [
        'q' => 'hello wolod'
    ]
]);
// 中身はjson
echo $response->getBody();

登録編 - /api/queries

登録には/api/queriesへPOSTで送る。ちなみにこのapiにGETで送ると、閲覧できるクエリが全部返ってくるっぽい。

$response = $client->post('/api/queries', [
    'json' => [
        'name'  => 'hello wolod',
        'query' => 'select * from test',
        'data_source_id' => 1, // データソースのid
        'description' => 'クエリの説明',
        'schedule' => '12:00' // UTCで解釈され、ユーザーのTimeZoneで変換される
    ]
]);
// jsonで登録内容が返ってくる
echo $response->getBody();

ドキュメントがなかったのでわからないが、登録する際に他の内容も入れられるかも。ただis_draft(publishでないかどうか)のフラグだけは、固定でtrue(not publish)になるようだった。

編集 - /api/queries/{query_id}

内容の更新は上記へpostで送る。getで送ると単にクエリの内容が、deleteで送るとアーカイブされるっぽい。

4/9追記 : deleteメソッドで送ってみても、削除されなかった。削除したい時は、is_archivedをtrueで更新すれば削除される。

やりたかったのはpublish状態にすること(is_draft=falseの状態)。queryも更新できる。

$response = $client->post('/api/queries/' . $queryId, [
    'json' => [
        'id'  => $queryId,
        'query' => 'select * from test2',
        'is_draft' => false,
    ]
]);
// jsonで登録内容が帰ってくる
echo $response->getBody();

リフレッシュ(クエリの実行) - /api/queries/{query_id}/refresh

$response = $client->post('/api/queries/' . $queryId . '/refresh', [
    'json' => [
        'id'  => $queryId
    ]
]);
// jsonで登録内容が帰ってくる
echo $response->getBody();

まとめ

頑張ればコードから仕様を追える。最終的には、Redashのページを操作したときに出てくるリクエストを追うのが早かった(Redashの各操作はAPIを通して行われているようなので)。

ただレスポンスやリクエストが不明瞭なのがすごい辛い。ドキュメント欲しい。

そのうちその他のAPIもまとめて、composerで使える形にしてgithubにあげたい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What are the problem?