[JAVA] Was ich mit der Redmine REST API süchtig gemacht habe

Hintergrund

Dieses Jahr hatte ich die Gelegenheit, Folgendes mit der "Redmine REST API" zu tun:

Zweck

Ich habe noch nie zuvor die Redmine REST-API verwendet und bei der Implementierung gelernt. Ich möchte, dass Sie uns mitteilen, wovon Sie süchtig waren, und die Fallen vermeiden, von denen ich süchtig war.

Annahme

Umgebung

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>

Ich war süchtig nach

1. API-Funktionen sind auch auf die dem Benutzer gewährten Berechtigungen beschränkt

Generieren Sie zuerst die RedmineManager-Klasse, um die Redmine REST-API zu verwenden. Verwenden Sie zu diesem Zeitpunkt "API KEY".

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

Dieser "API-Schlüssel" wird jedem Redmine-Benutzer gegeben. Zu diesem Zeitpunkt waren meine Benutzerrechte keine Administratorrechte. Einige API-Methoden erfordern Redmine-Systemadministratorrechte.

Holen Sie sich alle Benutzer


    /**
     * 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"));
    }

Wenn Sie es flexibel verwenden möchten, empfehlen wir Ihnen, über Systemadministratorrechte zu verfügen.

2. Erfordert "Transport"

Es scheint ein Konzept zu sein, das aus Version 4 oder höher von "redmine-java-api" stammt. Es kann von der RedmineManager-Klasse bezogen werden.

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

Ohne "Transport" wird beim Erstellen / Aktualisieren eines Tickets die Ausnahme "Transport ist nicht gesetzt!" Ausgelöst. Setzen Sie also "Transport" auf die Instanz von "Issue", bevor Sie es erstellen / aktualisieren.

Erstellen Sie ein neues Ticket


//Transport einstellen
Issue issue = new Issue(manager.getTransport());
//(Weggelassen)
issue = issue.create();

Vorhandenes Ticket aktualisieren


Issue issue = manager.getIssueManager().getIssueById(fetchedIssue.getTicketId());
//Transport einstellen
issue.setTransport(manager.getTransport());
//(Weggelassen)
issue.update();

3. Wie man Params benutzt

Wenn Sie ein vorhandenes Ticket aktualisieren, möchten Sie möglicherweise ein "Ticket erhalten, das diese Bedingung erfüllt". In diesem Fall kann "diese Bedingung" mit "Params" ausgedrückt werden.

Der Titel des Tickets lautet"actual.getFileName"Bedingung, die übereinstimmt


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

Ich war süchtig nach den folgenden drei Punkten.

Was ist der Schlüsselwert, wenn es sich nicht um den Titel handelt (Beispiel: Verantwortlicher)?

Ich konnte das Dokument nicht finden und habe es mit brutaler Gewalt identifiziert. Wenn Sie die gewünschten Bedingungen im Ticketlistenfilter festlegen, werden die Filterbedingungen als URL-Parameter angezeigt. Sie können den Wert des Schlüssels bestimmen, indem Sie die Parameter dekodieren. flow.png

Was ist, wenn es nicht übereinstimmt (z. B. nicht übereinstimmt, enthält)?

Analysieren Sie mit der oben beschriebenen Methode.

Ich möchte alle Tickets bekommen. Wenn ich sie also ohne Bedingungen bekomme, kann ich nur 500 Tickets bekommen

Die aktuelle Situation ist unbekannt. Wenn jemand weiß, wie das geht, lass es mich wissen.

4. Einmal löschen, wenn benutzerdefinierte Felder vorhandener Tickets aktualisiert werden

Rufen Sie das benutzerdefinierte Feld des vorhandenen Tickets einmal ab und aktualisieren Sie den Wert. Danach musste ich "clearCustomFields" löschen und dann die benutzerdefinierten Felder des vorhandenen Tickets hinzufügen, um es erfolgreich zu aktualisieren.

//Dieser Prozess ruft das benutzerdefinierte Feld aus dem vorhandenen Ticket ab, aktualisiert es und gibt es zurück.
Collection<CustomField> customFieldCollection = setEachCustomField(issue, fetchedIssue);
issue.clearCustomFields();
issue.addCustomFields(customFieldCollection);

5. Formatieren Sie beim Festlegen von Werten für benutzerdefinierte Felder vom Datumstyp

yyyy-MM-dd ist eine Option. Andernfalls wird ein Analysefehler angezeigt.

Oben (Ich werde es hinzufügen, wenn ich darauf komme.)

Referenz

Recommended Posts

Was ich mit der Redmine REST API süchtig gemacht habe
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ich war süchtig danach, onActivityResult () mit DialogFragment zu machen
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Probleme, denen ich beim Erstellen der Digdag-Umgebung mit Docker verfallen war
Ich war süchtig nach Unit-Tests mit dem Pufferoperator in RxJava
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich war süchtig danach, sbt zu starten
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Ich war süchtig nach Laradock + VSCode + xdebug
Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Ich habe versucht zusammenzufassen, was bei der Site-Java-Ausgabe gefragt wurde.
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
Ich habe versucht, die Stream-API zusammenzufassen
Technische Ursachen und Gegenmaßnahmen für die Punkte, denen ich mit der ersten Android-App und Kotlin verfallen war
[Rails] Ich war süchtig nach den Nginx-Einstellungen, als ich Action Cable verwendete.
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig nach RXTX mit Sierra
Versuchen Sie, den API-Schlüssel von Redmine mit Ruby zu erhalten
Erste Schritte mit Doma-Einführung in die Kriterien-API
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich war ein wenig süchtig nach dem S3-Prüfsummenvergleich, machen Sie sich also eine Notiz.
SpringSecurity Ich war süchtig danach, mich mit einem Hash-Passwort anzumelden (gelöst)
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Was muss ich tun, um die aktualisierte Docker-Datei neu zu laden?
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich habe versucht, Animationen mit der Blazor + Canvas-API zu zeichnen
Süchtig nach dem Webpacker, der standardmäßig mit Rails 6 geliefert wird
Ich habe versucht, den Betrieb der http-Anfrage (Put) mit dem Talented API Tester zu überprüfen
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Ich möchte die API mit Rails auf mehreren lokal eingerichteten Docker-Composes treffen
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Ich wusste, was Reflexion war
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
Als ich versuchte, mit JScrollBar automatisch zu scrollen, wurde der Ereignishandler nur einmal gezeichnet.
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Einführung in die EHRbase 2-REST-API
Ich habe versucht, den Chat mit dem Minecraft-Server mit der Discord-API zu verknüpfen
Implementierung einer starken API für "Ich möchte ~~ auf dem Bildschirm anzeigen" mit einfachem CQRS
REST-API-Test mit REST Assured