Ich lerne, wie man RESTful-Web-Services mit Spring 4 erstellt, und eine Sache, die ich nicht verstehe, ist @RequestMapping. Ich habe Beispiele gesehen, in denen headers = "Accept=application/xml"
verwendet wird und andere Beispiele konsumieren (oder produziert) = "application/xml"
.
Zum Beispiel habe ich in meiner eigenen @RestController-Klasse diese Funktion ...
%Vor% Was ist der Unterschied zwischen der Verwendung von headers = "Accept=application/xml"
vs. der Verwendung von konsumiert = "application/xml"?
Oder sogar die Verwendung von headers = "content-type=application/xml"
?
Könnte jemand die Unterschiede zwischen Headern und consums / products erklären und wenn jeder verwendet wird?
KURZE ANTWORT
In dem Beispiel, das Sie oben haben, wird die Verwendung von headers = "Accept=application/xml"
oder produces = "application/xml"
beide auf dieselbe Weise auf den Client antworten, d. H. Eine Antwort an den Client mit XML-Repräsentation senden.
LÄNGER ANTWORT
i. Header
Für REST-konforme Webdienste sendet der Client (z. B. Ihr Browser) eine Anfrage (z. B. GET, POST usw.) an einen Server, und der Server sendet eine Antwort zurück. Dies ist eine HTTP-Transaktion. Sowohl die Anfrage als auch die Antwort haben HTTP-Headerfelder ("headers"), die die Betriebsparameter einer HTTP-Transaktion definieren (ich werde auf die Header für die Client-Anfrage als "Anfrage-Header" verweisen, und diese unterscheiden sich von den Header-Antworten) Header ").
Als Teil der Anfrage, die Ihr Browser an den Server sendet, gibt es verschiedene Anfrage-Header und einige Beispiele beinhalten Accept
, Connection
, Content-Length
usw. und jeder dieser Header hat seine eigene Funktion (siehe eine vollständige Liste) von Kopfzeilen hier: Ссылка ).
Wenn ein Client eine POST-Anfrage durchführt, prüft Spring anhand des Codebeispiels die Anfragekopfzeile (n). Wenn eine Kopfzeile Accept
mit einem Wert von application/xml
gefunden wird, wird die Anfrage der% -Kennung zugeordnet. co_de% Methode, die Sie oben haben (und in Ihrem Fall gibt der Server eine XML-Antwortdarstellung an den Client zurück).
Lassen Sie mich das Element create
in dem von Ihnen bereitgestellten Code ändern:
Beachten Sie, dass das Element headers
jetzt den Wert headers
hat. Wenn ein Client eine POST-Anforderung ausführt, überprüft Spring die Anforderungsheader. Wenn ein Header Connection=keep-alive
mit einem Wert von Connection
gefunden wird, wird diese Clientanforderung der oben angegebenen keep-alive
-Methode zugeordnet.
ii. Produziert und konsumiert
Wenn Sie create
für die Methode produces="application/xml"
verwendet haben, bedeutet dies, dass eine Clientanforderung nur dann der Methode create
zugeordnet wird, wenn die create
-Kopfzeile des Clients Accept
entspricht. Dies ist im Wesentlichen der Client sagen, "Hey Server, ich bevorzuge es, Ihre Antwort in XML-Darstellung zu akzeptieren, so senden Sie Ihre Antwort an mich in XML". Effektiv ist der application/xml
auch der Server, der sagt: "Hey Client, ich kann Antworten nur für dich in XML-Darstellung produzieren, also werde ich dir dieses Format senden".
Link zur Spring-Dokumentationsreferenz .
Wenn Sie produces="application/xml"
für die Methode consumes="application/xml"
verwendet haben, bedeutet dies, dass eine Clientanforderung nur dann der Methode create
zugeordnet wird, wenn der create
Header des Clients mit Content-Type
übereinstimmt (der application/xml
Anfragekopf beschreibt die Darstellung der Client-Anfrage kommt). Das ist im Wesentlichen der Server, der sagt: "Hallo Client, ich kann nur Anfragen in XML-Darstellung konsumieren, also sende dieses Format an mich".
Zusammenfassung
Das Element Content-Type
in der Annotation headers
kann verschiedene Anforderungsheader haben ( @RequestMapping
, Accept
, Connection
usw.), aber das Cache-Control
-Element betrifft nur den Header produces
request und Accept
element betrifft nur den Header consumes
request.
Als Javadoc von HeadersRequestCondition
(die den Wert behandelt, der im headers
-Attribut einer @RequestMapping
-Anmerkung angegeben ist) gibt
Ausdrücke, die an den Konstruktor mit den Kopfnamen "Accept" oder "Accept" übergeben werden 'Inhaltstyp' wird ignoriert. Siehe
ConsumesRequestCondition
undProducesRequestCondition
für diejenigen.
Verwenden Sie diese Header nicht in headers
. Verwenden Sie die Attribute produces
und consumes
für Accept
und Content-Type
.
Wie man sie benutzt, gibt die Dokumentation Beispiele: für consumes
und für produces
.
Tags und Links java spring rest spring-mvc