Je veux écrire un simple client jersey 2 pour télécharger un fichier. J'utilise Jersey 2.10.1 et j'ai écrit le code serveur suivant:
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response uploadFile(
@FormDataParam("file") InputStream aUploadedInputStream,
@FormDataParam("file") FormDataContentDisposition aFileDetail) {
UploadedFile uploadedFile = new UploadedFile();
uploadedFile.setOriginalFileName(aFileDetail.getFileName());
uploadedFile.setFileSize(aFileDetail.getSize());
saveToFile(aUploadedInputStream, aFileDetail.getType(), uploadedFile);
databaseHelper.saveInDatabase(uploadedFile);
return Response.status(200).build();
}
("UploadedFile" est une classe personnalisée pour enregistrer les informations du fichier dans une base de données)
Et voici mon code client:
private static final String TARGET_URL = "http://localhost:49158/rest/service/upload";
public Slimclient() {
Client client = ClientBuilder.newBuilder()
.register(MultiPartFeature.class).build();
WebTarget webTarget = client.target(TARGET_URL);
MultiPart multiPart = new MultiPart();
FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
new File("C:/Users/Nicklas2751/Desktop/test.txt"), MediaType.APPLICATION_OCTET_STREAM_TYPE);
multiPart.bodyPart(fileDataBodyPart);
Response response = webTarget.request(
MediaType.MULTIPART_FORM_DATA).post(
Entity.entity(multiPart, multiPart.getMediaType()));
System.out.println(response.getStatus()+" "+response.getStatusInfo()+" "+response);
}
public static void main(String[] args) {
new Slimclient();
}
Le code du serveur s'exécute sans aucun problème, mais lorsque j'exécute le client, j'obtiens l'erreur suivante:
415 Unsupported Media Type InboundJaxrsResponse{ClientResponse{method=POST, uri=http://localhost:49158/rest/service/upload, status=415, reason=Unsupported Media Type}}
J'ai cherché sur le Web un bon tutoriel pour jersey 2 et multi-parties fileupload mais je ne peux trouver que des tutoriels et des exemples pour jersey 1 ou avec un formulaire HTML comme "Client". J'espère que le sombody peut m'aider :)
J'ai trouvé mon problème. J'ai manqué de définir le MediaType
du MultiPart
et avec la fonction .request(MediaType.MULTIPART_FORM_DATA)
j'ai mis le MediaType
attendu de la réponse à MULTIPART_FORM_DATA
. Voici le code de travail:
public class Slimclient {
private static final String TARGET_URL = "http://localhost:49158/rest/service/upload";
public Slimclient() {
Client client = ClientBuilder.newBuilder()
.register(MultiPartFeature.class).build();
WebTarget webTarget = client.target(TARGET_URL);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
new File("C:/Users/Nicklas/Desktop/aab.txt"),
MediaType.APPLICATION_OCTET_STREAM_TYPE);
multiPart.bodyPart(fileDataBodyPart);
Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(multiPart, multiPart.getMediaType()));
System.out.println(response.getStatus() + " "
+ response.getStatusInfo() + " " + response);
}
public static void main(String[] args) {
new Slimclient();
}
}