Développement

Datachain met à disposition un ensemble d’API permettant d’interagir avec l’application, indépendamment de l’interface. Les appels à l’API sont soumis à la même politique de gestion de droit. Un premier appel doit être fait auprès de keycloak pour obtenir un jeton, qui sera ensuite envoyé dans les requêtes métiers.

La documentation de l’api est disponible sous deux formats :

  • Le premier est une version légère et se trouve ici

  • Le second se situe ici. Attention, ce format, plus explicatif, est très lourd pour la navigateur. il faudra potentiellement patienter quelques minutes pour une utilisation optimale.

Exemple de code d’obtention d’un jeton auprès de keycloak

import com.fasterxml.jackson.databind.JsonNode;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** Un objet de configuration contient les informations nécessaires à l'authentification keycloak :
    Username, password, client id and client secret
*/

 public String getToken() {
    try {
      OkHttpClient client = new OkHttpClient().newBuilder().build();
      MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
      RequestBody body =
          RequestBody.create(
              mediaType,
              "grant_type=password&username="
                  + config.getKc().getUsername()
                  + "&password="
                  + config.getKc().getPassword()
                  + "&client_id="
                  + config.getKc().getClientId()
                  + "&client_secret="
                  + config.getKc().getClientSecret());
      Request request =
          new Request.Builder()
              .url(config.getKc().getUrl())
              .method("POST", body)
              .addHeader("Content-Type", "application/x-www-form-urlencoded")
              .build();
      Response response = client.newCall(request).execute();
      // l'ObjectMapper ci-dessous est un objectmapper jackson
      JsonNode json = ObjectMapper.getObjectMapper().readTree(response.body().bytes());

      return json.get("access_token").asText();
    } catch (Exception e) {
      // traitement de l'exception
    }
 }

Exemple de code d’appel api (ici une exposition sur un Datablock)

import com.adb.hdh.api.impl.DataBlockControllerApi;
import com.adb.hdh.api.impl.DataExposeControllerApi;
import com.adb.hdh.api.impl.DataFrameControllerApi;
import com.adb.hdh.api.invoker.ApiClient;
import com.adb.hdh.api.model.DataBlock;
import com.adb.hdh.api.model.DataFrameStatus;
import com.fasterxml.jackson.databind.JsonNode;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** Un objet de configuration contient les informations nécessaires à l’accès à Datachain :
    Url de Datachain
*/

 public String callApi(String token) {
    try {
      ApiClient defaultClient = new ApiClient();
      defaultClient.setBasePath(config.getDc().getUrl());
      defaultClient.setAccessToken(json.get("access_token").asText());

      // identifiant de datablock
      Long datablockId = 11L;
      // identifiant client (informatif)
      String clientId = "API Call";
      // identifiant du context
      Integer ctx = 1L;
      // identifiant du projet
      Long project = 1L;

      DataExposeControllerApi apiInstance = new DataExposeControllerApi(defaultClient);

      apiInstance.exposeDatablock(datablockId, clientId, ctx, project);
    } catch (Exception e) {
      // traitement de l'exception
    }
 }