2015-06-18 17 views
8

Sto imparando come creare servizi web RESTful utilizzando Spring 4 e una cosa su cui non sono chiaro è @RequestMapping. Ho visto esempi in cui si utilizza headers = "Accept=application/xml" e altri esempi che utilizzano consuma (o produce) = "application/xml".Spring 4 @RequestMapping - consuma vs intestazioni?

Per esempio, nella mia classe @RestController, ho questa funzione ...

// POST 
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/xml") 
public User create(@RequestBody User user) { 
    LOG.info("User = " + user.toString()); 
return userService.create(user); 
} 

Qual è la differenza tra l'utilizzo headers = "Accept=application/xml" vs utilizzando consuma = "application/xml"? o anche utilizzando headers = "content-type=application/xml"?

Qualcuno potrebbe spiegare le differenze tra le intestazioni e consuma/produce e quando ciascuna viene utilizzata?

risposta

1

Come javadoc di HeadersRequestCondition (che gestisce il valore fornito nel attributo di un @RequestMapping un'annotazione headers) afferma

Espressioni passati al costruttore con i nomi di intestazione 'Accetta' o 'Content-Type' sono ignorato. Vedi ConsumesRequestCondition e ProducesRequestCondition per quelli.

Quindi non utilizzare quelle intestazioni in headers. Utilizzare gli attributi produces e consumes per Accept e Content-Type.

Per quanto riguarda come utilizzarli, la documentazione fornisce esempi: for consumes e for produces.

+0

Non penso che sia ignorato, non c'è nulla al riguardo nella documentazione ufficiale. Inoltre funziona. Ad ogni modo, è preferibile utilizzare prodotti e consumazioni. –

+0

@VadimKirilchuk Sono ignorati in 'HeadersRequestCondition'. Vedere il codice sorgente, [qui] (https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition /HeadersRequestCondition.java#L65). Tuttavia, quegli stessi valori vengono anche passati a 'ProducesRequestCondition' e' ConsumesRequestCondition' quando si costruisce un 'RequestMappingInfo' per' RequestMappingHandlerMapping'. Vedi [qui] (http://stackoverflow.com/questions/34138501/java-illegalstateexception-on-http-response#34138501). –

+0

@VadimKirilchuk Inoltre, la citazione nella risposta proviene da javadoc. –

23

BREVE RISPOSTA
Nell'esempio si dispone sopra, usando headers = "Accept=application/xml" o produces = "application/xml" saranno entrambi rispondere al cliente allo stesso modo cioè inviare una risposta al client con rappresentazione XML.

RISPOSTA PIU '
i. Intestazioni
Per i servizi Web RESTful, il client (ad esempio il browser) invia una richiesta (ad esempio GET, POST, ecc.) A un server e il server invierà una risposta. Questa è una transazione HTTP. Sia la richiesta che la risposta hanno campi di intestazione HTTP ("intestazioni"), che definiscono i parametri operativi di una transazione HTTP (farò riferimento alle intestazioni per la richiesta client come "intestazioni di richiesta" e queste differiscono dalle intestazioni dalla risposta del server "risposta header ").

Come parte della richiesta il browser invia al server, ci sono diverse intestazioni di richiesta e di alcuni esempi comprendono Accept, Connection, Content-Length ecc e ciascuna di queste intestazioni hanno la loro funzione (vedere l'elenco completo delle intestazioni qui: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields).

Utilizzando il codice di esempio, se un cliente fa una richiesta POST, Primavera controllerà l'intestazione della richiesta (s) e se trova un colpo di testa Accept con un valore di application/xml, sarà mappare la richiesta al metodo create avete sopra (e nel tuo caso il server restituirà una rappresentazione di risposta XML al client).

Lasciatemi modificare l'elemento headers nel codice che hai fornito:

@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive") 
public User create(@RequestBody User user) { 
... 
} 

Avviso l'elemento headers ora ha un valore di Connection=keep-alive. Se un client esegue una richiesta POST, Spring controllerà le intestazioni della richiesta e se trova un'intestazione Connection con un valore di keep-alive, mapperà la richiesta del client al metodo create precedente.

ii. Produce e consuma
Se è stato utilizzato produces="application/xml" per il metodo create, questo significa che una richiesta del client viene mappata solo per il metodo create se Accept intestazione del client corrisponde application/xml. Questo essenzialmente è il client che dice "Ehi server, preferisco accettare la tua risposta nella rappresentazione XML, quindi invia la tua risposta a me in XML". In effetti, il produces="application/xml" è anche il server che dice: "Ehi cliente, posso solo produrre risposte per te nella rappresentazione XML, quindi ti invierò quel formato". Link to Spring documentation reference.

Se è stato utilizzato consumes="application/xml" per il metodo create, questo significa che una richiesta del client viene mappata solo per il metodo create se Content-Type intestazione del client corrisponde application/xml (l'intestazione Content-Type richiesta descrive la rappresentazione la richiesta del client è in arrivo). Questo essenzialmente è il server che dice: "Ehi cliente, posso solo utilizzare le richieste nella rappresentazione XML, quindi invia questo formato a me".

Sommario
L'elemento headers all'interno @RequestMapping nota può assumere diverse intestazioni di richiesta (Accept, Connection, Cache-Control ecc), ma l'elemento produces riguarda solo l'intestazione Accept richiesta e l'elemento consumes riguarda unicamente con l'intestazione della richiesta Content-Type.

+1

Questa risposta dovrebbe essere contrassegnata come risposta di accettazione. tra l'altro grazie Alex per la risposta dettagliata e informativa. –

+0

Qualche idea sul perché [questo non funziona] (http://stackoverflow.com/questions/42044639/file-upload-wont-work)? – displayname

Problemi correlati