Heim >Java >javaLernprogramm >Wie lade ich Dateien mit eingebetteten Entitätsdaten in einen RESTful-Webdienst von Jersey hoch?

Wie lade ich Dateien mit eingebetteten Entitätsdaten in einen RESTful-Webdienst von Jersey hoch?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-05 14:10:14826Durchsuche

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

Datei-Upload mit Entitätsdaten in einem Jersey RESTful Web Service

Problem:

Die Aufgabe besteht darin, einen Mitarbeiter anzulegen Aufzeichnen, während ein entsprechendes Bild in einem einzigen REST-Aufruf hochgeladen wird. Das Ziel besteht darin, diese Funktionalität auf nahtlose und effiziente Weise zu erreichen.

Lösung:

Um dieses Ziel zu erreichen, ist es wichtig zu verstehen, dass mehrere Inhalte vorhanden sind -Types in derselben Anfrage werden nicht unterstützt. Stattdessen sollten die Mitarbeiterdaten als Teil der mehrteiligen Anfrage einbezogen werden.

Der folgende Codeausschnitt veranschaulicht, wie dies erreicht wird:

@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

}

Hier ist das @FormDataParam("emp") Annotation hilft beim Extrahieren der Mitarbeiterdaten aus der mehrteiligen Anfrage. Darüber hinaus sollte die Employee-Klasse mit geeigneten Getter- und Setter-Methoden definiert werden.

Multipart-Testen:

Um die Multipart-Funktionalität zu testen, kann die MultiPartFeature-Klasse bei registriert werden Jersey-Client mit register(MultiPartFeature.class). Beispielsweise kann das folgende Test-Snippet verwendet werden:

@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();
}

Dieser Test erstellt eine mehrteilige Anfrage, die sowohl das Bild als auch die Mitarbeiterdaten enthält.

Überlegungen:

  • Einige Clients, wie z. B. Postman, erlauben möglicherweise nicht die Festlegung einzelner Inhaltstypen für Körperteile. Sie können den Content-Type jedoch explizit festlegen, bevor Sie die Daten deserialisieren, indem Sie jsonPart.setMediaType(MediaType.APPLICATION_JSON_TYPE); verwenden.
  • Alternativ können Sie einen String-Parameter verwenden und die JSON-Daten mithilfe einer JSON-Bibliothek manuell deserialisieren .

Das obige ist der detaillierte Inhalt vonWie lade ich Dateien mit eingebetteten Entitätsdaten in einen RESTful-Webdienst von Jersey hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn