Maison >Java >javaDidacticiel >Comment télécharger des fichiers avec des données d'entité intégrées dans un service Web Jersey RESTful ?

Comment télécharger des fichiers avec des données d'entité intégrées dans un service Web Jersey RESTful ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 14:10:14827parcourir

How to Upload Files with Embedded Entity Data in a Jersey RESTful Web Service?

Téléchargement de fichiers avec des données d'entité dans un service Web RESTful Jersey

Problème :

La tâche consiste à créer un employé enregistrer tout en téléchargeant une image correspondante dans un seul appel REST. L'objectif est d'atteindre cette fonctionnalité de manière transparente et efficace.

Solution :

Afin d'atteindre cet objectif, il est important de comprendre qu'avoir plusieurs contenus -Les types dans la même requête ne sont pas pris en charge. Au lieu de cela, les données des employés doivent être incluses dans le cadre de la requête multipart.

L'extrait de code suivant illustre comment y parvenir :

@POST
@Path("/upload2")
@Consumes({MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response uploadFileWithData(
    @FormDataParam("file") InputStream fileInputStream,
    @FormDataParam("file") FormDataContentDisposition contentDispositionHeader,
    @FormDataParam("emp") Employee emp) {

    // Business logic

}

Ici, le @FormDataParam("emp") l'annotation aide à extraire les données des employés de la demande en plusieurs parties. De plus, la classe Employee doit être définie avec les méthodes getter et setter appropriées.

Test multipart :

Pour tester la fonctionnalité multipart, la classe MultiPartFeature peut être enregistrée auprès du Client Jersey utilisant Register (MultiPartFeature.class). Par exemple, l'extrait de test suivant peut être utilisé :

@Test
public void testGetIt() throws Exception {
    
    final Client client = ClientBuilder.newBuilder()
        .register(MultiPartFeature.class)
        .build();
    WebTarget t = client.target(Main.BASE_URI).path("multipart").path("upload2");

    FileDataBodyPart filePart = new FileDataBodyPart("file", 
                                             new File("stackoverflow.png"));
    String empPartJson
            = "{ ... employee data as JSON ... }";

    MultiPart multipartEntity = new FormDataMultiPart()
            .field("emp", empPartJson, MediaType.APPLICATION_JSON_TYPE)
            .bodyPart(filePart);
          
    Response response = t.request().post(
            Entity.entity(multipartEntity, multipartEntity.getMediaType()));
    System.out.println(response.getStatus());
    System.out.println(response.readEntity(String.class));

    response.close();
}

Ce test crée une requête en plusieurs parties qui inclut à la fois l'image et les données de l'employé.

Considérations :

  • Certains clients, comme Postman, peuvent ne pas autoriser la définition de types de contenu de parties de corps individuelles. Cependant, vous pouvez définir explicitement le Content-Type avant de désérialiser les données en utilisant jsonPart.setMediaType(MediaType.APPLICATION_JSON_TYPE);.
  • Vous pouvez également utiliser un paramètre String et désérialiser les données JSON manuellement à l'aide d'une bibliothèque JSON. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn