Proljetno pregovaranje o sadržaju MVC-a

1. Pregled

Ovaj članak opisuje kako implementirati pregovaranje o sadržaju u proljetni MVC projekt.

Općenito postoje tri mogućnosti za određivanje vrste medija zahtjeva:

  • Upotreba sufiksa URL-a (proširenja) u zahtjevu (npr .xml / .json)
  • Korištenje URL parametra u zahtjevu (npr ? format = json)
  • Koristeći Prihvatiti zaglavlje u zahtjevu

Prema zadanim postavkama ovo je redoslijed kojim će voditelj pregovora o proljetnom sadržaju pokušati koristiti ove tri strategije. A ako nijedna od njih nije omogućena, možemo odrediti zamjensku vrijednost za zadani tip sadržaja.

2. Strategije pregovaranja o sadržaju

Počnimo s potrebnim ovisnostima - radimo s JSON i XML reprezentacijama, pa ćemo za ovaj članak koristiti Jackson za JSON:

 com.fasterxml.jackson.core jackson-core 2.10.2 com.fasterxml.jackson.core jackson-databind 2.10.2 

Za XML podršku možemo koristiti JAXB, XStream ili noviju podršku Jackson-XML.

Budući da smo objasnili upotrebu Prihvatiti zaglavlje u ranijem članku o Pretvarači HttpMessageConvertera, usredotočimo se na prve dvije strategije u dubinu.

3. Strategija URL sufiksa

Prema zadanim postavkama ova je strategija onemogućena, ali okvir može provjeriti ima li proširenja staze izravno iz URL-a kako bi odredio vrstu izlaznog sadržaja.

Prije ulaska u konfiguracije, hajde da kratko pogledamo primjer. Imamo sljedeću jednostavnu implementaciju API metode u tipičnom proljetnom kontroleru:

@RequestMapping (value = "/ zaposlenik / {id}", proizvodi = {"application / json", "application / xml"}, method = RequestMethod.GET) public @ResponseBody Employee getEfficieeById (@PathVariable long id) {return workerMap .get (id); } 

Zazovimo ga koristeći JSON proširenje za specificiranje vrste medija resursa:

curl //localhost:8080/spring-mvc-basics/employee/10.json

Evo što bismo mogli dobiti natrag ako upotrijebimo JSON proširenje:

{"id": 10, "name": "Test Employee", "contactNumber": "999-999-9999"}

I evo kako će izgledati zahtjev-odgovor s XML-om:

curl //localhost:8080/spring-mvc-basics/employee/10.xml

Tijelo odgovora:

 999-999-9999 10 Zaposlenik na testiranju 

Sada, ako ne koristimo nikakvo produženje ili koristite onaj koji nije konfiguriran, vratit će se zadana vrsta sadržaja:

curl // localhost: 8080 / spring-mvc-basics / zaposlenik / 10

Pogledajmo sada postavljanje ove strategije - s Java i XML konfiguracijama.

3.1. Java konfiguracija

javna praznina configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). ignoreAcceptHeader (true). useJaf (lažno). defaultContentType (MediaType.APPLICATION_JSON); }

Idemo preko detalja.

Prvo, omogućavamo strategiju proširenja puta. Također je vrijedno spomenuti da je od Spring Framework 5.2.4 favorPathExtension (boolean) metoda zastarjela kako bi se obeshrabrila upotreba proširenja puta za pregovore o sadržaju.

Zatim onemogućamo strategiju parametra URL-a kao i Prihvatiti strategija zaglavlja - jer se želimo osloniti samo na način proširenja puta pri određivanju vrste sadržaja.

Tada isključujemo Java Activation Framework; JAF se može koristiti kao zamjenski mehanizam za odabir izlaznog formata ako dolazni zahtjev ne odgovara niti jednoj strategiji koju smo konfigurirali. Onemogućujemo ga jer ćemo konfigurirati JSON kao zadanu vrstu sadržaja. Imajte na umu da the useJaf () metoda zastarjela je od Spring Framework 5.

I na kraju - postavljamo JSON kao zadani. To znači da ako se ne podudara niti jedna od dvije strategije, svi dolazni zahtjevi preslikavat će se u metodu kontrolera koja služi JSON-u.

3.2. XML konfiguracija

Kratko ćemo pogledati istu točnu konfiguraciju, samo koristeći XML:

4. Strategija parametra URL-a

U prethodnom smo odjeljku koristili proširenja puta - postavimo sada Spring MVC kako bismo koristili parametar puta.

Ovu strategiju možemo omogućiti postavljanjem vrijednosti favorParametar svojstvo na istinito.

Pogledajmo na brzinu kako bi to funkcioniralo s našim prethodnim primjerom:

curl // localhost: 8080 / spring-mvc-basics / worker / 10? mediaType = json

A evo što će biti tijelo odgovora JSON:

{"id": 10, "name": "Test Employee", "contactNumber": "999-999-9999"}

Ako koristimo XML parametar, izlaz će biti u XML obliku:

curl // localhost: 8080 / spring-mvc-basics / worker / 10? mediaType = xml

Tijelo odgovora:

 999-999-9999 10 Zaposlenik na testiranju 

Sada napravimo konfiguraciju - opet, prvo koristeći Javu, a zatim XML.

4.1. Java konfiguracija

javna praznina configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (false). favorParameter (true). parameterName ("vrsta medija"). ignoreAcceptHeader (true). useJaf (lažno). defaultContentType (MediaType.APPLICATION_JSON). vrsta medija ("xml", MediaType.APPLICATION_XML). vrsta medija ("json", MediaType.APPLICATION_JSON); } 

Pročitajmo ovu konfiguraciju.

Prvo, naravno, produžetak staze i Prihvatiti strategije zaglavlja su onemogućene (kao i JAF).

Ostatak konfiguracije je isti.

4.2. XML konfiguracija

Također, možemo imati omogućene obje strategije (proširenje i parametar) u isto vrijeme:

javna praznina configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (true). parameterName ("vrsta medija"). ignoreAcceptHeader (true). useJaf (lažno). defaultContentType (MediaType.APPLICATION_JSON). vrsta medija ("xml", MediaType.APPLICATION_XML). vrsta medija ("json", MediaType.APPLICATION_JSON); }

U ovom slučaju, Spring će prvo tražiti proširenje puta, ako to nije prisutno, onda će tražiti parametar puta. A ako oba nisu dostupna u ulaznom zahtjevu, tada će se vratiti zadana vrsta sadržaja.

5. The Prihvatiti Strategija zaglavlja

Ako je Prihvatiti zaglavlje je omogućeno, Spring MVC tražit će njegovu vrijednost u dolaznom zahtjevu kako bi odredio vrstu predstavljanja.

Moramo postaviti vrijednost ignoreAcceptHeader na false kako bismo omogućili ovaj pristup, a onemogućavamo druge dvije strategije samo kako bismo znali da se oslanjamo samo na Prihvatiti Zaglavlje.

5.1. Java konfiguracija

javna praznina configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). parameterName ("vrsta medija"). ignoreAcceptHeader (false). useJaf (lažno). defaultContentType (MediaType.APPLICATION_JSON). vrsta medija ("xml", MediaType.APPLICATION_XML). vrsta medija ("json", MediaType.APPLICATION_JSON); }

5.2. XML konfiguracija

Na kraju, trebamo uključiti upravitelj pregovora o sadržaju tako što ćemo ga uključiti u ukupnu konfiguraciju:

6. Zaključak

I gotovi smo. Pogledali smo kako pregovaranje o sadržaju djeluje u Spring MVC-u i usredotočili smo se na nekoliko primjera postavljanja koji koriste razne strategije za određivanje vrste sadržaja.

Potpuna provedba ovog članka može se naći na GitHubu.