Spring 4 @RequestMapping - verbraucht vs headers?

8

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?

    
Chris 18.06.2015, 18:41
quelle

2 Antworten

24

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:

%Vor%

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.

    
Alex Ander 29.06.2015 15:51
quelle
2

Als Javadoc von HeadersRequestCondition (die den Wert behandelt, der im headers -Attribut einer @RequestMapping -Anmerkung angegeben ist) gibt

an
  

Ausdrücke, die an den Konstruktor mit den Kopfnamen "Accept" oder "Accept" übergeben werden   'Inhaltstyp' wird ignoriert. Siehe ConsumesRequestCondition und    ProducesRequestCondition 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 .

    
Sotirios Delimanolis 18.06.2015 18:48
quelle

Tags und Links