Vår MVC-innholdsforhandling

1. Oversikt

Denne artikkelen beskriver hvordan du implementerer innholdsforhandlinger i et Spring MVC-prosjekt.

Generelt er det tre alternativer for å bestemme medietypen på en forespørsel:

  • Bruke URL-suffikser (utvidelser) i forespørselen (f.eks .xml / .json)
  • Bruker URL-parameter i forespørselen (f.eks ? format = json)
  • Ved hjelp av Aksepterer topptekst i forespørselen

Som standard er dette rekkefølgen Spring Innholdsforhandlingsleder vil prøve å bruke disse tre strategiene. Og hvis ingen av disse er aktivert, kan vi spesifisere en reserve til en standard innholdstype.

2. Innholdsforhandlingsstrategier

La oss starte med de nødvendige avhengighetene - vi jobber med JSON- og XML-representasjoner, så for denne artikkelen bruker vi Jackson for JSON:

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

For XML-støtte kan vi bruke enten JAXB, XStream eller den nyere Jackson-XML-støtten.

Siden vi har forklart bruken av Aksepterer topptekst i en tidligere artikkel om HttpMessageConverters, la oss fokusere på de to første strategiene i dybden.

3. URL-suffiksstrategien

Som standard er denne strategien deaktivert, men rammeverket kan se etter en stiutvidelse rett fra URL-en for å bestemme utdatainnholdstypen.

Før vi går inn i konfigurasjoner, la oss se raskt på et eksempel. Vi har følgende enkle API-implementeringsmetode i en typisk vårkontroller:

@RequestMapping (verdi = "/ ansatt / {id}", produserer = {"applikasjon / json", "applikasjon / xml"}, metode = RequestMethod.GET) offentlig @ResponseBody-ansatt getEmployeeById (@PathVariable lang id) {return medarbeiderKart .get (id); } 

La oss påkalle det ved hjelp av JSON-utvidelsen for å spesifisere mediatypen på ressursen:

krøll //localhost:8080/spring-mvc-basics/employee/10.json

Her er hva vi kan få tilbake hvis vi bruker en JSON-utvidelse:

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

Og her er hvordan forespørselssvaret vil se ut med XML:

krøll //localhost:8080/spring-mvc-basics/employee/10.xml

Responsorganet:

 999-999-9999 10 Testmedarbeider 

Nå, hvis vi ikke bruker noen utvidelse eller bruk en som ikke er konfigurert, vil standard innholdstype returneres:

krøll // localhost: 8080 / vår-mvc-grunnleggende / ansatt / 10

La oss nå ta en titt på å sette opp denne strategien - med både Java- og XML-konfigurasjoner.

3.1. Java-konfigurasjon

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). ignoreAcceptHeader (true). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON); }

La oss gå gjennom detaljene.

For det første aktiverer vi strategien for stiutvidelser. Det er også verdt å nevne at fra og med Spring Framework 5.2.4, har favorPathExtension (boolsk) metoden avvikles for å motvirke bruken av stiutvidelser for innholdsforhandlinger.

Deretter deaktiverer vi URL-parameterstrategien i tillegg til Aksepterer headerstrategi - fordi vi bare vil stole på stienutvidelsesmåten for å bestemme typen innhold.

Vi slår deretter av Java Activation Framework; JAF kan brukes som reservemekanisme for å velge utdataformat hvis den innkommende forespørselen ikke samsvarer med noen av strategiene vi konfigurerte. Vi deaktiverer det fordi vi skal konfigurere JSON som standard innholdstype. Vær oppmerksom på at de brukJaf () metoden avvikles fra og med Spring Framework 5.

Og til slutt - vi setter opp JSON som standard. Det betyr at hvis ingen av de to strategiene samsvarer, vil alle innkommende forespørsler bli kartlagt til en kontrollermetode som serverer JSON.

3.2. XML-konfigurasjon

La oss også ta en rask titt på den samme eksakte konfigurasjonen, bare ved bruk av XML:

4. URL-parameterstrategien

Vi har brukt stiutvidelser i forrige seksjon - la oss nå sette opp Spring MVC for å gjøre bruk av en styparameter.

Vi kan aktivere denne strategien ved å sette verdien på favorittparameter eiendom til sant.

La oss se raskt på hvordan det ville fungere med vårt forrige eksempel:

krøll // localhost: 8080 / vår-mvc-grunnleggende / ansatt / 10? mediaType = json

Og her er hva JSON-responsorganet vil være:

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

Hvis vi bruker XML-parameteren, vil utgangen være i XML-form:

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

Responsorganet:

 999-999-9999 10 Testmedarbeider 

La oss nå gjøre konfigurasjonen - igjen, først ved hjelp av Java og deretter XML.

4.1. Java-konfigurasjon

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (false). favorParameter (true). parameternavn ("mediaType"). ignoreAcceptHeader (true). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); } 

La oss lese gjennom denne konfigurasjonen.

Først, selvfølgelig, stiutvidelsen og Aksepterer headerstrategier er deaktivert (så vel som JAF).

Resten av konfigurasjonen er den samme.

4.2. XML-konfigurasjon

Også, vi kan ha begge strategiene (utvidelse og parameter) aktivert samtidig:

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (true). parameternavn ("mediaType"). ignoreAcceptHeader (true). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

I dette tilfellet vil Spring først lete etter stiutvidelse, hvis den ikke er tilstede, vil den lete etter stiparameter. Og hvis begge disse ikke er tilgjengelige i inngangsforespørselen, vil standard innholdstype bli returnert tilbake.

5. Den Aksepterer Topptekststrategi

Hvis den Aksepterer header er aktivert, vil Spring MVC se etter verdien i den innkommende forespørselen for å bestemme representasjonstypen.

Vi må sette verdien på ignoreAcceptHeader for å falske for å aktivere denne tilnærmingen, og vi deaktiverer de to andre strategiene bare slik at vi vet at vi bare stoler på Aksepterer Overskrift.

5.1. Java-konfigurasjon

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). parameternavn ("mediaType"). ignoreAcceptHeader (false). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

5.2. XML-konfigurasjon

Til slutt må vi slå på manager for innholdsforhandlinger ved å plugge den inn i den generelle konfigurasjonen:

6. Konklusjon

Og vi er ferdige. Vi så på hvordan innholdsforhandlinger fungerer i Spring MVC, og vi fokuserte på noen få eksempler på å sette opp det for å bruke forskjellige strategier for å bestemme innholdstypen.

Den fulle implementeringen av denne artikkelen finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found