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
.
Non penso che sia ignorato, non c'è nulla al riguardo nella documentazione ufficiale. Inoltre funziona. Ad ogni modo, è preferibile utilizzare prodotti e consumazioni. –
@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). –
@VadimKirilchuk Inoltre, la citazione nella risposta proviene da javadoc. –