Quelle est la différence entre @FormDataParam
et @FormParam
?
J'utilisais plusieurs @FormDataParam
dans une méthode, mais elle renvoyait une erreur de type de support non pris en charge. Mais quand j'ai utilisé @FormParam
, J'ai les valeurs.
Donc, j'ai besoin de savoir quelle est la différence entre les deux?
@FormDataParam
est censé être utilisé avec des données de type Multipart (c'est-à-dire multipart/form-data
ou MediaType.MULTIPART_FORM_DATA
), qui dans sa forme brute ressemble à quelque chose
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
Le multipart est principalement utilisé pour envoyer des données binaires, comme des fichiers non textuels.
@FormParam
est pour les paramètres de requête encodés en URL (c'est-à-dire application/x-www-form-urlencoded
ou MediaType.APPLICATION_FORM_URLENCODED
), qui sous forme brute ressemble à
param1=value1¶m2=value2
Ces deux types sont principalement utilisés dans les formulaires côté client. Par exemple
<form method="POST" action="someUrl">
<input name="gender" type="text">
<input name="name" type="text">
</form>
ce qui précède enverrait les paramètres de demande comme application/x-www-form-urlencoded
. Il serait envoyé sous forme brute
gender=male&name=peeskillet
Côté serveur, on peut utiliser un @FormParam
pour chaque paramètre nommé dans le formulaire
@FormParam("gender") String gender, @FormParam("name") String name
Mais si nous devons envoyer disons une image avec les paramètres, application/x-form-url-encoded
le type de données n'est pas suffisant, car il ne traite que du texte. Nous devons donc utiliser Multipart
<form method="POST" action="someUrl", enctype="multipart/form-data">
<input name="gender" type="text">
<input name="name" type="text">
<input name="avatar" type="file">
</form>
Ici, le type Multipart est spécifié, maintenant le navigateur enverra la demande avec quelque chose comme
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="gender"
Male
--AaB03x
Content-Disposition: form-data; name="name"
Peskillet
--AaB03x
Content-Disposition: form-data; name="avatar"; filename="image.png"
Content-Type: image/png
... binary content of image file ...
--AaB03x--
Sur le serveur, similaire au application/x-www-form-urlencoded
exemple ci-dessus, pour chaque paramètre Multipart (ou champ pour être plus précis), on peut utiliser @FormDataParam
pour signifier chaque paramètre
@FormDataParam("gender") String gender,
@FormDataParam("name") String name,
@FormDataParam("avatar") InputStream avatar
Voir aussi:
De la documentation FormParam :
Lie la ou les valeurs d'un paramètre de formulaire contenu dans un corps d'entité de demande à un paramètre de méthode de ressource. Les valeurs sont décodées par URL, sauf si cela est désactivé à l'aide de l'annotation codée. Une valeur par défaut peut être spécifiée à l'aide de l'annotation DefaultValue. Si le corps de l'entité de demande est absent ou est d'un type de support non pris en charge, la valeur par défaut est utilisée.
Lie la ou les parties de corps nommées d'un corps d'entité de demande "multipart/form-data" à un paramètre de méthode de ressource.