web-dev-qa-db-fra.com

Quelle est la différence entre @FormDataParam et @FormParam

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?

12
  • @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&param2=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:

16
Paul Samsotha

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.

et FormDataParam

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.

1
Rahul Tripathi