4 votes

Comment montrer plusieurs exemples dans la documentation swagger ?

Dans mon opération REST API PATCH, j'utilise la version 3. swagger-annotation:2.0.6

J'essayais d'ajouter plus d'exemples comme schéma swagger pour mon opération de patch. PATCH /users/id .

Corps de la demande :

{
  "operationList": [
    {
      "op": "replace",
      "path": "/username",
      "value": "john1991"
    }
  ]
}

Actuellement, j'ai la classe suivante pour le modèle de demande.

public class UserPatchOp extends PatchOperation {
    @Override
    @Schema(description = "some description", example = "replace", required = true)
    public PatchOperator getOp() {
        return super.getOp();
    }

    @Override
    @Schema(description = "some description", example = "/username", required = true)
    public String getPath() {
        return super.getPath();
    }

    @Override
    @Schema(description = "some description", , example = "john1991", required = true)
    public Object getValue() {
        return super.getValue();
    }
}

Dans PatchOperation.java

public class PatchOperation {

    /**
     * {@link PatchOperator} operation to be performed
     */
    @Schema(description = "Operation to be performed", required = true)
    @JsonProperty
    @NotNull
    private PatchOperator op;

    @Schema(description = "Path to target where operation will be performed", required = true)
    @JsonProperty
    @Pattern(regexp = "/([/A-Za-z0-9~])*-*", message = "Invalid path. Please follow regex pattern")
    private String path;

    @Schema(description = "Value used by operation")
    @JsonProperty
    private Object value;

    public PatchOperation() {
    }
}

Dans le document swagger, dans UserPatchOp.java J'ai montré à l'utilisateur final comment remplacer le nom d'utilisateur. Sur swagger, la bogie de demande vient avec cet exemple.

enter image description here

autre que le nom d'utilisateur à travers cette opération de patch, l'utilisateur final peut mettre à jour la description alors le chemin sera /description .

L'utilisateur final peut également mettre à jour le groupe d'utilisateurs auquel il appartient dans '/usergroups'. Donc, en général, de la même manière, je veux ajouter plus d'exemples au schéma swagger. Mais je ne suis pas en mesure de le faire. Parce qu'à un moment donné, je ne peux montrer qu'un seul exemple.

Je veux montrer les opérations multiples suivantes au client sur une page swagger.

{
  "operationList": [
    {
      "op": "replace",
      "path": "/username",
      "value": "john1991"
    },
    {
      "op": "remove",
      "path": "/description"
    },
    {
      "op": "add",
      "path": "/memberships"
      "value":["1224","8907"]
    }
  ]
}

Et la méthode du point d'entrée est

@PATCH

@Path("users/{id}")
@Consumes({MediaType.APPLICATION_JSON, APPLICATION_JSON_PATCH_JSON})
@ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = MessageConstants.OK, content = @Content(schema = @Schema(implementation = UserInfo.class))),
        @ApiResponse(responseCode = "500", description = MessageConstants.SERVER_ERROR, content = @Content(schema = @Schema(implementation = RestError.class))),
        @ApiResponse(responseCode = "400", description = MessageConstants.BAD_REQUEST, content = @Content(schema = @Schema(implementation = RestError.class))),
        @ApiResponse(responseCode = "401", description = MessageConstants.UNAUTHORIZED, content = @Content(schema = @Schema(implementation = RestError.class))),
        @ApiResponse(responseCode = "404", description = MessageConstants.NOT_FOUND, content = @Content(schema = @Schema(implementation = RestError.class)))})
public Response updatePartialUser(
        @Parameter(description = "User Id", required = true) @PathParam("id") String id,
        @Parameter(description = "User Update Info", required = true) @Valid PatchOperations<UserPatchOperation> operationList) {

Existe-t-il un moyen d'ajouter plusieurs exemples pour les méthodes getOP, getPath et getValue ? Merci.

0 votes

Oui, parce que c'est ainsi qu'il faut procéder. Si vous voulez supprimer le nom d'utilisateur, vous devez créer une méthode avec @ DeleteMapping, pour ajouter le nom d'utilisateur avec @ PostMapping, pour l'obtenir avec @ GetMapping Ainsi, à la fin, vous aurez 3+ méthodes avec le point de terminaison /nom d'utilisateur. Lisez cet article, peut-être qu'il vous éclairera : blog.logrocket.com/

0 votes

@Szprota21 Merci pour votre réponse. J'ai mis à jour ma question en conséquence. J'ai une opération de patch qui est responsable de la mise à jour de la ressource que j'ai comme le nom d'utilisateur, la description et le groupe d'utilisateurs. Il faut que je montre plusieurs exemples dans le schéma swagger.

2voto

Szprota21 Points 381

Il est possible de créer plusieurs exemples de réponses qu'une méthode peut renvoyer, mais il est possible de ne faire qu'un seul exemple pour un seul code de réponse.

@Operation(description = "Retrieves status of application",
               responses = {
                       @ApiResponse(responseCode = "200",
                                    description = "Everything works fine.",
                                    content = @Content(mediaType = "application/json",
                                                       examples = @ExampleObject(value = "{\n" +
                                                                                         "  \"success\" : true,\n" +
                                                                                         "  \"message\" : \"OK\"\n" +
                                                                                         "}"))),
                       @ApiResponse(responseCode = "500",
                                    description = "Application not working properly",
                                    content = @Content(mediaType = "application/json",
                                                       examples = @ExampleObject(value = "{\n" +
                                                                                         "  \"success\" : false,\n" +
                                                                                         "  \"message\" : \"Application not working properly\"\n" +
                                                                                         "}")))
               })
    @GetMapping("haproxy")
    ResponseEntity<BaseResponse> getHaProxy();

Je ne sais pas si c'est ce que vous voulez, mais je ne vois pas d'autre solution.

Gardez à l'esprit que la documentation swagger doit être réalisée de manière à ce que quelqu'un puisse se connecter à votre api et effectuer certaines opérations. Vous n'avez pas besoin de fournir trop de réponses à cet endroit. C'est pour la méthode de repos OPTIONS. La méthode OPTIONS est essentiellement un GET qui n'a pas besoin de paramètres et qui renvoie en réponse des informations complètes sur ce qu'une certaine méthode peut faire et ce que sera la demande/réponse. Vous trouverez ici une meilleure explication à ce sujet : Méthodes API RESTful ; HEAD & OPTIONS

Vous devriez mettre à jour vos dépendances, swagger-annotations est sur 2.1.4 maintenant, 2.0.6 est d'il y a 2 ans.

EDIT 2020-09-30 A propos du corps de la demande :

Il est possible d'ajouter des exemples de demandes multiples comme cela :

@Operation(description = "Creates a User",
           requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "Request examples",
                                                                               content = @Content(examples = {
                                                                                       @ExampleObject(name = "doing weird stuff", value = "http://localhost:7080"),
                                                                                       @ExampleObject(name = "doing weirdest stuff", value = "{\n\"test\":\"12\"\n}"),
                                                                               })),
           responses = {
                   @ApiResponse(responseCode = "200",
                                description = "Everything works fine.",
                                content = @Content(mediaType = "application/json",
                                                   schema = @Schema(implementation = UserResponse.class))),
                   @ApiResponse(responseCode = "404",
                                description = "Not found",
                                content = @Content(mediaType = "application/json",
                                                   examples = @ExampleObject(value = "{\"success\":false,\"message\":\"That shop or API version is not accessible yet\",\"httpStatus\":\"NOT_FOUND\"}"))),
                   @ApiResponse(responseCode = "500",
                                description = "Something went wrong",
                                content = @Content(mediaType = "application/json",
                                                   schema = @Schema(implementation = SomeBasicResponse.class)))
           })
@Parameters({
                    @Parameter(in = ParameterIn.HEADER, name = "url",
                               content = @Content(schema = @Schema(type = "string", defaultValue = "localhost:7080")))
            })

@PostMapping
ResponseEntity<UserResponse> createUser(@RequestHeader(name = "login", required = false) String login,
                                              @RequestHeader(name = "password") String password,
                                              @RequestBody UserRequest request);

RequestBody example No. 1

RequestBody example No. 2

J'espère que c'est ce que vous recherchez.

0 votes

J'ai mis à jour ma question. En fait, je cherche à savoir comment mettre mon exemple json dans le corps de la requête de la page swagger.

0 votes

J'ai mis à jour mes réponses, j'espère que cela résoudra votre problème.

0voto

Neel Points 163

J'ai ajouté un exemple au point d'entrée avec l'aide du schéma.

@Parameter(description = "Update User", required = true, schema = @Schema (example = "{\n  "
                    + "\"operationList\": [\n    "
                    + "{\n      \"op\": \"replace\",\n      \"path\": \"/username\",\n      \"value\": \"john1991\"\n    },\n    "
                    + "{\n      \"op\": \"replace\",\n      \"path\": \"/description\",\n      \"value\": \"NewDescription\"\n    },\n    "
                    + "{\n      \"op\": \"add\",\n      \"path\": \"/memberships\",\n      "
                    + "\"value\":[\"1234\",\"6789\"]\n    "
                    + "{\n      \"op\": \"remove\",\n      \"path\": \"/privileges\",\n      \"value\":[\"148\",\"155\"]\n    "
                    + "}\n  ]\n}")) @Valid PatchOperations<UserPatchOperation> operationList) throws RestException

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X