[JAVA] Ce à quoi j'étais accro avec l'API REST Redmine

Contexte

Cette année, j'ai eu l'occasion de faire ce qui suit avec la Redmine REST API:

Objectif

Je n'ai jamais utilisé Redmine REST API auparavant, et j'ai appris en l'implémentant. J'aimerais que vous partagiez ce à quoi vous étiez accro et que vous évitiez les pièges auxquels j'étais accro.

supposition

environnement

Redmine Version


Environment:
  Redmine version                3.4.6.stable

java Version


java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

pom.xml


        <dependency>
            <groupId>com.taskadapter</groupId>
            <artifactId>redmine-java-api</artifactId>
            <version>4.0.0.preview.1</version>
        </dependency>

J'étais accro à

1. Les fonctions de l'API sont également limitées aux privilèges accordés à l'utilisateur

Générez d'abord la classe RedmineManager pour utiliser l'API REST Redmine. À ce stade, utilisez quelque chose appelé ʻAPI KEY`.

RedmineManager manager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);

Cette ʻAPI KEY` est donnée à chaque utilisateur Redmine. À cette époque, mes droits d'utilisateur n'étaient pas des droits d'administrateur. Certaines méthodes d'API nécessitent des privilèges d'administrateur système Redmine.

Obtenez tous les utilisateurs


    /**
     * Load list of users from the server.
     * <p><strong>This operation requires "Redmine Administrator" permission.</strong>
     * <p>
     * This method calls Redmine with "include = memberships,groups" parameter.
     *
     * @return list of User objects
     * @throws RedmineAuthenticationException invalid or no API access key is used with the server, which
     *                                 requires authorization. Check the constructor arguments.
     * @throws NotFoundException
     * @throws RedmineException
     */
    public List<User> getUsers() throws RedmineException {
        return transport.getObjectsList(User.class, new BasicNameValuePair(
                "include", "memberships,groups"));
    }

Si vous souhaitez l'utiliser de manière flexible, nous vous recommandons de disposer des privilèges d'administrateur système.

2. Nécessite un "Transport"

Cela semble être un concept tiré de la version 4 ou plus récente de redmine-java-api. Il peut être obtenu à partir de la classe RedmineManager.

RedmineManager redmineManager = RedmineManagerFactory.createWithApiKey(REDMINE_URL, API_KEY);
Transport transport = redmineManager.getTransport();

Sans Transport, l'exception" Le transport n'est pas défini! "Est lancée lors de la création / mise à jour d'un ticket. Veuillez donc définir Transport sur l'instance de ʻIssue` avant de créer / mettre à jour.

Créer un nouveau ticket


//Définir le transport
Issue issue = new Issue(manager.getTransport());
//(Omis)
issue = issue.create();

Mettre à jour le ticket existant


Issue issue = manager.getIssueManager().getIssueById(fetchedIssue.getTicketId());
//Définir le transport
issue.setTransport(manager.getTransport());
//(Omis)
issue.update();

3. Comment utiliser Params

Lors de la mise à jour d'un ticket existant, vous souhaiterez peut-être obtenir un "ticket qui remplit cette condition". Dans ce cas, "cette condition" peut être exprimée en utilisant "Params".

Le titre du billet est"actual.getFileName"Condition qui correspond


Params().add("set_filter", "1")
        .add("f[]", "subject")
        .add("op[subject]", "=")
        .add("v[subject][]", actual.getFileName());

J'étais accro aux trois points suivants.

Quelle est la valeur clé quand ce n'est pas le titre (exemple: responsable)?

Je n'ai pas trouvé le document, j'ai donc utilisé la force brute pour l'identifier. Si vous définissez les conditions souhaitées dans le filtre de liste de tickets, les conditions de filtre seront affichées en tant que paramètres d'URL. Vous pouvez déterminer la valeur de clé en décodant les paramètres. flow.png

Que faire s'il ne correspond pas (par exemple, ne correspond pas, inclut)?

Analysez par la méthode ci-dessus.

Je veux obtenir tous les billets, donc si je les reçois sans aucune condition, je ne peux obtenir que 500 billets

La situation actuelle est inconnue. Si quelqu'un sait comment faire cela, faites-le moi savoir.

4. Effacer une fois lors de la mise à jour des champs personnalisés des tickets existants

Obtenez une fois le champ personnalisé du ticket existant et mettez à jour la valeur. Après cela, j'ai dû clearCustomFields puis ajouter les champs personnalisés du ticket existant pour le mettre à jour avec succès.

//Ce processus obtient le champ personnalisé du ticket existant, le met à jour et le renvoie.
Collection<CustomField> customFieldCollection = setEachCustomField(issue, fetchedIssue);
issue.clearCustomFields();
issue.addCustomFields(customFieldCollection);

5. Format lors de la définition des valeurs pour les champs personnalisés de type date

aaaa-MM-jj est une option. Sinon, vous obtiendrez une erreur d'analyse.

Ci-dessus (je l'ajouterai quand je le proposerai.)

référence

Recommended Posts

Ce à quoi j'étais accro avec l'API REST Redmine
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
J'étais accro au paramètre API version min23 de registerTorchCallback
J'étais accro à faire onActivityResult () avec DialogFragment
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'étais accro aux tests unitaires avec l'opérateur de tampon dans RxJava
J'étais accro à NoSuchMethodError dans Cloud Endpoints
J'étais accro au record du modèle associé
J'étais accro au démarrage de sbt
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Ce à quoi j'étais accro en utilisant rspec sur des rails
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
J'étais accro à la mise à jour de la déclaration dans MyBatis
J'étais accro au réglage de laradock + VSCode + xdebug
J'étais étrangement accro à l'utilisation de l'API Stream de Java avec Scala
L'histoire à laquelle j'étais accro lors de la création de STS
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
J'ai essayé de résumer l'API Stream
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec la première application Android et Kotlin
[Rails] J'étais accro aux paramètres nginx lors de l'utilisation d'Action Cable.
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
J'étais accro au scrollview car je ne pouvais pas appuyer sur la taille variable UIView
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais accro à l'utilisation de RXTX avec Sierra
Essayez d'obtenir la clé API de redmine avec ruby
Premiers pas avec Doma - Introduction à l'API Criteria
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
SpringSecurity J'étais accro à essayer de me connecter avec un mot de passe haché (résolu)
J'ai essayé ce que je voulais essayer avec Stream doucement.
Que dois-je faire pour recharger le Dockerfile mis à jour?
Je souhaite utiliser le mode sombre avec l'application SWT
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
Accro au Webpacker fourni en standard avec Rails 6
J'ai essayé de vérifier le fonctionnement de la requête http (Put) avec Talented API Tester
Notez que j'étais accro au traitement par lots avec Spring Boot
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
Je savais ce qu'était la réflexion
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
Lorsque j'ai essayé de faire défiler automatiquement avec JScrollBar, le gestionnaire d'événements n'a été dessiné qu'une seule fois.
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Introduction à l'API EHRbase 2-REST
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
Test de l'API REST avec REST Assured