2016-05-31 53 views
8

Qual è la differenza tra @FormDataParam e @FormParam?Qual è la differenza tra @FormDataParam e @FormParam

Stavo usando più @FormDataParam in un metodo ma stava lanciando un errore di tipo di supporto non supportato. Ma quando ho usato @FormParam, ho ottenuto i valori.

Quindi, ho bisogno di sapere qual è la differenza tra loro due?

+0

FormDataParam viene utilizzato in combinazione con multipart/form-data. Questo è un metodo più efficiente per trasferire dati binari come allegati piuttosto che usare FormParam. Si prega di consultare la documentazione di [FormDataParam] (https://jersey.java.net/nonav/apidocs/1.0.3/contribs/jersey-multipart/com/sun/jersey/multipart/FormDataParam.html) –

risposta

8
  • @FormDataParam si suppone per essere utilizzato con i dati di tipo multipart (cioè multipart/form-data o MediaType.MULTIPART_FORM_DATA), che nella sua forma grezza sembra qualcosa di simile

    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-- 
    

    multipart è utilizzato principalmente per l'invio di dati binari, come non file di testo.

  • @FormParam e per parametri di richiesta URL (cioè application/x-www-form-urlencoded o MediaType.APPLICATION_FORM_URLENCODED), che in forma grezza assomiglia

    param1=value1&param2=value2 
    

Entrambi questi tipi sono utilizzati principalmente in forme lato client. Ad esempio

<form method="POST" action="someUrl"> 
    <input name="gender" type="text"> 
    <input name="name" type="text"> 
</form> 

sopra invierebbe i parametri di richiesta come application/x-www-form-urlencoded. Sarebbe vengono inviati in forma grezza come

gender=male&name=peeskillet 

Sul lato server, possiamo usare una @FormParam per ogni parametro denominato in forma

@FormParam("gender") String gender, @FormParam("name") String name 

Ma se abbiamo bisogno di inviare dire un'immagine insieme i parametri, il tipo di dati application/x-form-url-encoded non è sufficiente, in quanto riguarda solo il testo ASCII. Quindi abbiamo bisogno di usare 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> 

Qui il tipo multipart è specificato, ora il browser invierà la richiesta con qualcosa come

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-- 

Sul server, simile con l'esempio application/x-www-form-urlencoded sopra, per ciascun parametro Multipart (o campo per essere più precisi), possiamo usare @FormDataParam per indicare ogni parametro

@FormDataParam("gender") String gender, 
@FormDataParam("name") String name, 
@FormDataParam("avatar") InputStream avatar 

Vedi anche:

+0

Sì, ora la sua chiaro. Ma l'unica cosa che non sono in grado di capire è questo. Il mio modulo non stava usando 'multipart/form-data'. Ancora ero in grado di ottenere la stringa come @FormDataParam quando avevo solo un parametro. Ma quando sono passato a due parametri si è abbassato a lavorare. Dopo averlo modificato su @FormParam ora funziona. –

+1

Penso che nel tuo caso il '@ FormDataParam' sia stato completamente ignorato perché il tipo di media previsto è' application/x-www-form-urlencoded'. Per quanto riguarda i dati in entrata, poiché '@ FormParam' non è usato, ti dà solo i dati come l'intera stringa di richiesta. –

+0

Per quanto riguarda "non funziona", perché un metodo può accettare un parametro del corpo, generalmente questo parametro non ha annotazioni, come quando si ottiene un POJO JSON. Se si tenta di aggiungere un altro parametro, Jersey non ha idea di quale sia il parametro del corpo, quindi genera un errore all'avvio. Se dovessi registrare il 'MultiPartFeature' con la tua applicazione, Jersey non genererebbe l'errore, in quanto la funzione riconosce le annotazioni' @ FormDataParam', quindi pensa che sia quello che ti aspetti. Anche se non sono sicuro che la deserializzazione avrebbe successo. –

1

Dalla documentazione FormParam:

associa il valore (s) di un parametro modulo contenuto all'interno di un corpo dell'entità richiesta ad un metodo di risorsa parametro. I valori sono decodificati dall'URL a meno che non sia disabilitato utilizzando l'annotazione Encoded.È possibile specificare un valore predefinito utilizzando l'annotazione DefaultValue. Se il corpo dell'entità della richiesta è assente o è un tipo di supporto non supportato, viene utilizzato il valore predefinito .

e FormDataParam

lega la parte del corpo di nome (s) di un "multipart/form-data" richiesta di un'entità corpo ad un parametro di metodo risorsa.