Swagger Codegen-CLI-Java-Client – so nutzen Sie es richtig

Ich bin derzeit rund um das Spiel mit meiner jersey2 rest-Dienst. Für einen besseren überblick der Leistung (Beschreibung, Arten und so weiter) ich stark zu verwenden, von Fors (Fors-jersey2-jaxrs).
Also ich bin in der Lage, genereate meine service-Beschreibung (Fors.json) und ich kann sehen und erkunden Sie über swagger-ui.

Nun bin ich an dem Punkt, dass ich brauche, um einige clients diese Dienste nutzen. Ich kam accrooss swagger codegen cli ist ein nettes tool für das generieren der client und viele verschiedene Sprachen (java, in meinem Fall). Ich bin in der Lage, zum generieren der api-client und das Modell im Einsatz.

Hier kam ich auf das erste problem. Der REST-services und Fors Beschreibung sind die http-basic-auth geschützt. Ich lese die Dokumentation, das gab mir einen Hinweis, dass es es gibt eine Möglichkeit der Verwendung von basic-auth. An dieser Stelle muss ich erwähnen, dass aus meiner Sicht die doucmentation ist sehr schlecht. Es sagt:

-a , –auth
Hinzugefügt authorization-Header beim abrufen von Fors Definitionen aus der Ferne. Pass in ein URL-kodierter string mit name:header mit einem Komma trennt mehrere Werte.

Erste, was ich thoght ist, um eine Zeichenfolge übergeben, wie in einem http-header, aber das hat eigentlich alles nicht funktionieren und sogar googlen, wie man in basic-auth mit swagger cli nicht dazu führen, dass einige klare answser. Nach einer Menge von versuchen und Fehlern habe ich (ich bin mit CLI 2.1.2), habe ich endlich kam in das richtige format, z.B.:

java-jar swagger-codegen-cli-2.1.2.jar erzeugen -ein „Authorization: Basic YWRtaW46YWRtaW4=“ -i http://localhost:8080/webproject/restapi/swagger.json -l java -o restclient

wo YWRtaW46YWRtaW4= ist die base64-codierte Wert von admin:admin in meinem Fall.

So weit So gut. Die generierten java-client nutzen müssen, basic-auth, wie gut. Ich warf einen Blick auf die Methoden aus der ApiClient und fand setUsername und setPassword. Ich dachte, dass diese Methoden empoweres der client für die Verwendung von basic-auth, aber kein Glück.

Also nahm ich einen genaueren Blick auf die generierten Klassen ist besonders die ApiClient und die verschiedenen generierten ApiService Klassen.
Ich fand heraus, dass die setUsername und setPassword haben keine Wirkung, da der folgende:

/**
   * Helper method to set username for the first HTTP basic authentication.
   */
  public void setUsername(String username) {
    for (Authentication auth : authentications.values()) {
      if (auth instanceof HttpBasicAuth) {
        ((HttpBasicAuth) auth).setUsername(username);
        return;
      }
    }
    throw new RuntimeException("No HTTP basic authentication configured!");
  }

wo zur gleichen Zeit die HashMap wird wie folgt definiert:

//Setup authentications (key: authentication name, value: authentication).
authentications = new HashMap<String, Authentication>();
//Prevent the authentications from being modified.
authentications = Collections.unmodifiableMap(authentications);

Die Authentifizierung hashmap wird unveränderlich sein, aber warum? Was ist der Stiftungszweck? Darüber hinaus gibt es keine Hilfsmethoden innerhalb der ApiClinet generiert die benötigten auth-Objekt, also Tat ich Folgendes:

1) kommentieren Sie die Zeile Beglaubigungen Sammlungen.unmodifiableMap(Authentifizierungen), so dass die hashmap wird modifizierbar wieder

2) erstellen Sie benötigte auth-Objekt Händisch

HttpBasicAuth authentication = new HttpBasicAuth(); 
authentication.setUsername("admin");
authentication.setPassword("admin");

3) fügen Sie den auth-Objekt, um die apiClients Authentifizierung hashmap:

ApiClient apiClient = new ApiClient();
apiClient.setBasePath(basePath);
apiClient.getAuthentications().put("basic", authentication);

4) ändern invokeApi-Methode (ApiClient.java)

public String invokeAPI(String path, String method, Map<String, String> queryParams, Object body, Map<String, String> headerParams, Map<String, String> formParams, String accept, String contentType, String[] authNames) throws ApiException {
String authNames2[] = {"basic"};
updateParamsForAuth(authNames2, queryParams, headerParams);
//updateParamsForAuth(authNames, queryParams, headerParams);
...

Schritt 4 ist notwendig, weil die ApiServices aufrufen der apiClient Methode wie folgt:

String[] authNames = new String[] {  };
String response = apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames);

Eine andere mögliche Lösung wäre, den Schlüssel definiert werden, auf die Authentifizierungen hashmap in jedem apiService wie:

String[] authNames = new String[] { "basic" };

Nach all den änderungen, alles wie erwartet funktioniert, aber ich nicht denke, dass das ist die Idee hinter eine automatisch generierte rest-client.
Also meine Frage ist: Bin ich falsch oder sollte ich denke an die swagger erzeugte client (java in diesem Fall) eher eine beta-Lösung, die unter Entwicklung?
Bitte Holen Sie mich richtig, ich finde das ganze Gehabe framework (jersey2 support, Open API, swaggerui, codegen) ist eine tolle Sache, und ich Schätze die Entwickler Mühe, aber ich will das codegen Recht und ich glaube nicht, dass die Idee dahinter ist, so haben zum anpassen der generierten ApiClient und ApiServices so.

InformationsquelleAutor Matthias | 2016-09-27

 

One Reply
  1. 11

    Das Problem ist, dass Ihre Spezifikation nicht erwähnt, die Arten der Sicherheit, die Sie verwenden möchten (ein.k.ein. Sicherheit-Definitionen) oder die Sicherheits-Definition gilt, die Ende Punkt.

    Fors-Spezifikation ist hier, aber es sagt nicht die ganze Geschichte.

    Was Sie tun müssen, ist 1. Einrichten der Security-Definitionen. Hier ist eine einfache basic-http auth definition:

    securityDefinitions:
      basic:
        type: basic
        description: HTTP Basic Authentication. 

    und 2. Verwenden Sie das security-definition in der end-Punkt.

    paths:
      /:
        get:
          security:
           - basic: []
          responses:
            200:
              description:  OK

    Dann regenerieren Sie Ihre stolzieren client-code. Es sollte die unveränderliche anzeigen korrekt und die authNames array.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.