Negosiasi Konten MVC Musim Semi

1. Ikhtisar

Artikel ini menjelaskan cara menerapkan negosiasi konten dalam proyek MVC Spring.

Secara umum, ada tiga opsi untuk menentukan jenis media permintaan:

  • Menggunakan sufiks URL (ekstensi) dalam permintaan (misalnya .xml / .json )
  • Menggunakan parameter URL dalam permintaan (misalnya ? Format = json )
  • Menggunakan Terima header dalam permintaan

Secara default, ini adalah urutan di mana manajer negosiasi konten Spring akan mencoba menggunakan tiga strategi ini. Dan jika tidak ada yang diaktifkan, kami dapat menentukan fallback ke tipe konten default.

2. Strategi Negosiasi Isi

Mari kita mulai dengan dependensi yang diperlukan - kami bekerja 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 dukungan XML, kita dapat menggunakan JAXB, XStream, atau dukungan Jackson-XML yang lebih baru.

Karena kami telah menjelaskan penggunaan header Terima di artikel sebelumnya di HttpMessageConverters, mari fokus pada dua strategi pertama secara mendalam.

3. Strategi Sufiks URL

Secara default, strategi ini dinonaktifkan, tetapi framework dapat memeriksa ekstensi jalur langsung dari URL untuk menentukan jenis konten keluaran.

Sebelum masuk ke konfigurasi, mari kita lihat contoh. Kami memiliki implementasi metode API sederhana berikut dalam pengontrol Spring yang 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 panggil dengan menggunakan ekstensi JSON untuk menentukan jenis media dari sumber daya:

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

Inilah yang mungkin kami dapatkan kembali jika kami menggunakan ekstensi JSON:

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

Dan inilah tampilan request-response dengan XML:

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

Badan respons:

 999-999-9999 10 Test Employee 

Sekarang, jika kita tidak menggunakan ekstensi apa pun atau menggunakan ekstensi yang tidak dikonfigurasi, jenis konten default akan dikembalikan:

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

Sekarang mari kita lihat penyiapan 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 bahas detailnya.

Pertama, kami mengaktifkan strategi ekstensi jalur. Perlu juga disebutkan bahwa mulai Spring Framework 5.2.4, metode favorPathExtension (boolean) tidak digunakan lagi untuk mencegah penggunaan ekstensi jalur untuk negosiasi konten.

Kemudian, kami menonaktifkan strategi parameter URL serta strategi header Terima - karena kami hanya ingin mengandalkan cara ekstensi jalur untuk menentukan jenis konten.

Kami kemudian mematikan Java Activation Framework; JAF dapat digunakan sebagai mekanisme fallback untuk memilih format output jika permintaan masuk tidak cocok dengan strategi yang kami konfigurasikan. Kami menonaktifkannya karena kami akan mengkonfigurasi JSON sebagai tipe konten default. Harap dicatat bahwa metode useJaf () tidak digunakan lagi pada Spring Framework 5 .

Dan terakhir - kami menyiapkan JSON menjadi default. Artinya, jika tidak ada dari dua strategi yang cocok, semua permintaan yang masuk akan dipetakan ke metode pengontrol yang melayani JSON.

3.2. Konfigurasi XML

Mari kita lihat sekilas konfigurasi yang persis sama, hanya menggunakan XML:

4. Strategi Parameter URL

Kita telah menggunakan ekstensi jalur di bagian sebelumnya - sekarang mari kita siapkan Spring MVC untuk menggunakan parameter jalur.

Kita dapat mengaktifkan strategi ini dengan menyetel nilai properti favorParameter ke true.

Mari kita lihat sekilas bagaimana itu akan bekerja dengan contoh kita sebelumnya:

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

Dan inilah isi respons JSON:

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

Jika kita menggunakan parameter XML, outputnya akan berbentuk XML:

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

Badan respons:

 999-999-9999 10 Test Employee 

Sekarang mari kita lakukan konfigurasi - lagi, pertama 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 kita baca konfigurasi ini.

Pertama, tentu saja, ekstensi jalur dan strategi header Terima dinonaktifkan (serta JAF).

Konfigurasi lainnya sama.

4.2. Konfigurasi XML

Selain itu, kita dapat mengaktifkan kedua strategi (ekstensi dan parameter) pada saat yang bersamaan:

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 hal ini, Spring akan mencari ekstensi jalur terlebih dahulu, jika tidak ada maka akan mencari parameter jalur. Dan jika keduanya tidak tersedia dalam permintaan input, maka tipe konten default akan dikembalikan.

5. Strategi Terima Header

Jika header Terima diaktifkan, Spring MVC akan mencari nilainya dalam permintaan masuk untuk menentukan jenis representasi.

Kami harus menyetel nilai ignoreAcceptHeader ke false untuk mengaktifkan pendekatan ini dan kami menonaktifkan dua strategi lainnya hanya agar kami tahu kami hanya mengandalkan header 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

Terakhir, kita perlu mengaktifkan pengelola negosiasi konten dengan memasukkannya ke dalam konfigurasi keseluruhan:

6. Kesimpulan

Dan kami selesai. Kami melihat bagaimana negosiasi konten bekerja di Spring MVC dan kami berfokus pada beberapa contoh pengaturan itu untuk menggunakan berbagai strategi untuk menentukan jenis konten.

Penerapan lengkap artikel ini dapat ditemukan di GitHub.