1. Gambaran keseluruhan
Artikel ini menerangkan cara melaksanakan perundingan kandungan dalam projek Spring MVC.
Secara amnya, terdapat tiga pilihan untuk menentukan jenis permintaan media:
- Menggunakan akhiran URL (peluasan) dalam permintaan (mis. Xml / .json )
- Menggunakan parameter URL dalam permintaan (mis . Format = json )
- Menggunakan header Terima dalam permintaan
Secara lalai, ini adalah urutan di mana pengurus perundingan kandungan Spring akan cuba menggunakan ketiga strategi ini. Dan jika tidak ada yang diaktifkan, kami dapat menentukan penggantian ke jenis kandungan lalai.
2. Strategi Rundingan Kandungan
Mari mulakan dengan kebergantungan yang diperlukan - kami bekerjasama dengan representasi JSON dan XML, jadi untuk artikel ini, kami akan menggunakan Jackson untuk JSON:
com.fasterxml.jackson.core jackson-core 2.10.2 com.fasterxml.jackson.core jackson-databind 2.10.2
Untuk sokongan XML, kita dapat menggunakan JAXB, XStream, atau sokongan Jackson-XML yang lebih baru.
Oleh kerana kami telah menjelaskan penggunaan header Accept dalam artikel sebelumnya mengenai HttpMessageConverters, mari kita fokus pada dua strategi pertama secara mendalam.
3. Strategi Akhiran URL
Secara lalai, strategi ini dilumpuhkan, tetapi kerangka kerja dapat memeriksa lanjutan jalur langsung dari URL untuk menentukan jenis kandungan output.
Sebelum pergi ke konfigurasi, mari kita lihat contohnya dengan cepat. Kami mempunyai pelaksanaan kaedah API sederhana berikut dalam pengawal Spring khas:
@RequestMapping( value = "/employee/{id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET) public @ResponseBody Employee getEmployeeById(@PathVariable long id) { return employeeMap.get(id); }
Mari kita gunakan menggunakan sambungan JSON untuk menentukan jenis media sumber:
curl //localhost:8080/spring-mvc-basics/employee/10.json
Inilah yang mungkin kita dapat kembali sekiranya menggunakan pelanjutan JSON:
{ "id": 10, "name": "Test Employee", "contactNumber": "999-999-9999" }
Dan inilah rupa permintaan-respons dengan XML:
curl //localhost:8080/spring-mvc-basics/employee/10.xml
Badan tindak balas:
999-999-9999 10 Test Employee
Sekarang, jika kita tidak menggunakan pelanjutan atau menggunakan yang tidak dikonfigurasi, jenis kandungan lalai akan dikembalikan:
curl //localhost:8080/spring-mvc-basics/employee/10
Sekarang mari kita melihat strategi ini - dengan konfigurasi Java dan XML.
3.1. Konfigurasi Java
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(false). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON); }
Mari kita perhatikan perinciannya.
Pertama, kami mengaktifkan strategi peluasan jalan. Perlu juga disebutkan bahawa pada Spring Framework 5.2.4, kaedah favorPathExtension (boolean) tidak digunakan lagi untuk mengelakkan penggunaan sambungan jalur untuk rundingan kandungan.
Kemudian, kami melumpuhkan strategi parameter URL dan juga strategi Terima tajuk - kerana kami hanya mahu bergantung pada cara peluasan jalan untuk menentukan jenis kandungan.
Kami kemudian mematikan Kerangka Pengaktifan Java; JAF dapat digunakan sebagai mekanisme penggantian untuk memilih format output jika permintaan masuk tidak sesuai dengan strategi yang kami konfigurasikan. Kami melumpuhkannya kerana kami akan mengkonfigurasi JSON sebagai jenis kandungan lalai. Harap maklum bahawa kaedah useJaf () tidak digunakan lagi pada Spring Framework 5 .
Dan akhirnya - kami menetapkan JSON untuk menjadi lalai. Itu bermaksud jika tidak ada dua strategi yang cocok, semua permintaan masuk akan dipetakan ke metode pengawal yang melayani JSON.
3.2. Konfigurasi XML
Mari kita lihat juga konfigurasi tepat yang sama, hanya menggunakan XML:
4. Strategi Parameter URL
Kami telah menggunakan peluasan laluan di bahagian sebelumnya - mari sekarang siapkan Spring MVC untuk menggunakan parameter jalur.
Kita boleh mengaktifkan strategi ini dengan menetapkan nilai properti FavorParameter menjadi benar.
Mari kita lihat bagaimana ia berfungsi dengan contoh sebelumnya:
curl //localhost:8080/spring-mvc-basics/employee/10?mediaType=json
Dan inilah badan tindak balas JSON:
{ "id": 10, "name": "Test Employee", "contactNumber": "999-999-9999" }
Sekiranya kita menggunakan parameter XML, output akan dalam bentuk XML:
curl //localhost:8080/spring-mvc-basics/employee/10?mediaType=xml
Badan tindak balas:
999-999-9999 10 Test Employee
Sekarang mari kita lakukan konfigurasi - sekali lagi, pertama kali menggunakan Java dan kemudian XML.
4.1. Konfigurasi Java
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false). favorParameter(true). parameterName("mediaType"). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); }
Mari baca konfigurasi ini.
Pertama, tentu saja, peluasan jalan dan strategi tajuk Terima dilumpuhkan (serta JAF)
Selebihnya konfigurasi adalah sama.
4.2. Konfigurasi XML
Kami juga dapat mengaktifkan kedua strategi (peluasan dan parameter) pada masa yang sama:
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(true). parameterName("mediaType"). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); }
Dalam kes ini, Spring akan mencari peluasan laluan terlebih dahulu, jika tidak ada maka akan mencari parameter jalur. Dan jika kedua-duanya tidak tersedia dalam permintaan input, maka jenis kandungan lalai akan dikembalikan.
5. Strategi Terima Header
Sekiranya header Terima diaktifkan, Spring MVC akan mencari nilainya dalam permintaan masuk untuk menentukan jenis representasi.
Kami harus menetapkan nilai igneAcceptHeader ke false untuk membolehkan pendekatan ini dan kami melumpuhkan dua strategi lain supaya kami tahu bahawa kami hanya bergantung pada tajuk Terima .
5.1. Konfigurasi Java
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(false). parameterName("mediaType"). ignoreAcceptHeader(false). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); }
5.2. Konfigurasi XML
Akhirnya, kita perlu menghidupkan pengurus perundingan kandungan dengan memasukkannya ke konfigurasi keseluruhan:
6. Kesimpulannya
Dan kita sudah selesai. Kami melihat bagaimana perundingan kandungan berfungsi di Spring MVC dan kami menumpukan pada beberapa contoh menetapkannya untuk menggunakan pelbagai strategi untuk menentukan jenis kandungan.
Pelaksanaan penuh artikel ini boleh didapati di GitHub.