Artikel sebelumnya menjelaskan integrasi boot musim semi dengan JDBCtemplate, JPA dan MyBatis untuk mencapai akses ke database. Hari ini saya terutama akan berbagi dengan Anda cara mengembalikan data ke front-end melalui boot musim semi.
Dalam proses pengembangan saat ini, untuk memaksimalkan pemisahan ujung depan dan belakang, antarmuka backend biasanya hanya menyediakan antarmuka data, dan frontend memperoleh data dari backend melalui permintaan AJAX dan mengirimkannya kepada pengguna. Cara paling umum yang kami gunakan adalah bahwa backend akan mengembalikan string JSON ke frontend, dan frontend parse string JSON untuk menghasilkan objek JavaScript, dan kemudian memprosesnya. Artikel ini akan menunjukkan bagaimana Spring Boot mengimplementasikan model ini. Artikel ini akan fokus pada cara merancang API yang tenang dan mengimplementasikan API terkait melalui Spring Boot. Namun, agar semua orang dapat lebih memahami API bergaya REST, pertama-tama kami akan merancang antarmuka pengembalian data tradisional sehingga semua orang dapat memahaminya sebagai perbandingan.
Mari kita ambil daftar artikel sebagai contoh untuk mengimplementasikan antarmuka yang mengembalikan daftar artikel, kodenya adalah sebagai berikut:
@Controller @requestMapping ("/artikel") kelas publik ArticLecontroller {@Autowired Private ArticleService ArtikelService; @RequestMapping ("/list.json") @ResponseBody Daftar publik <TARTENTER> ListArtikel (Judul String, Integer Pagesize, Integer Pagenum) {if (halaman == null) {pageSize = 10; } if (pagenum == null) {pagenum = 1; } int offset = (pagenum - 1) * halaman; return artikelService.getarticles (judul, 1L, offset, halaman); }}Implementasi ArtikelService sangat sederhana, yang hanya merangkum pengoperasian artiklemapper. Anda dapat merujuk ke artikel sebelumnya. Kelas implementasi artikel adalah sebagai berikut:
@ServicePublic Class ArtikelServiceImpl mengimplementasikan ArtikelService {@Autowired Private Articlemapper Articlemapper; @Override public long saveArticle (artikel @RequestBody artikel) {return articlemapper.insertarticle (artikel); } @Override Daftar Publik <TARTICE> GetArticles (Judul String, UserID Long, Int Offset, Int PageSize) {Artikel Artikel = Artikel baru (); artikel.settitle (judul); artikel.setUserId (userid); return articlemapper.queryArticlesByPage (artikel, offset, halaman); } @Override Public Artikel GetById (Long ID) {return articlemapper.queryById (id); } @Override public void updateArticle (artikel artikel) {artikel.setupDateTime (tanggal baru ()); Articlemapper.updateArticleById (artikel); }}Jalankan kelas Application.java, lalu kunjungi: http: // locahost: 8080/artikel/list.json, Anda dapat melihat hasil berikut:
ArtikelServiceImpl adalah kelas yang sangat biasa, dengan hanya satu anotasi musim semi @Service, diidentifikasi sebagai kacang untuk manajemen yang mudah melalui wadah IOC musim semi. Mari kita lihat kelas Articlecontroller. Bahkan, mereka yang telah menggunakan MVC musim semi harus terbiasa dengan anotasi ini. Ini penjelasan singkat:
@Controller mengidentifikasi kelas sebagai pengontrol.
@Requestmapping URL Mapping.
@ResponseBody Mengembalikan hasil yang dikonversi ke string JSON.
@Requestbody berarti menerima parameter string format JSON.
Melalui ketiga anotasi ini, kami dapat dengan mudah menerapkan fungsi mengembalikan data format JSON ke front-end melalui URL. Tapi semua orang pasti sedikit bingung. Apakah hal -hal ini dari Spring MVC? Apa hubungannya dengan boot musim semi? Bahkan, fungsi boot pegas adalah untuk menyimpan proses konfigurasi kami. Fungsi lain memang disediakan oleh Spring dan Spring MVC untuk kita. Setiap orang harus ingat bahwa Spring Boot memberi kami layanan konfigurasi otomatis melalui berbagai starter. Ketergantungan ini diperkenalkan dalam proyek kami sebelumnya:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-web </artifactid> </dependency>
Ini adalah paket JAR yang semua proyek web Spring Boot perlu diperkenalkan. Dengan kata lain, selama proyek web boot musim semi mendukung fungsi di atas secara default. Di sini kami lebih lanjut menemukan bahwa mengembangkan rekayasa web melalui Spring Boot memang menyimpan banyak pekerjaan konfigurasi.
Oke, mari kita lihat bagaimana menerapkan API yang tenang. Faktanya, Restful sendiri bukanlah teknologi yang mendalam, tetapi hanya gaya pemrograman, atau gaya desain. Dalam desain antarmuka HTTP tradisional, kami umumnya hanya menggunakan metode GET dan POST, dan kemudian menggunakan kosakata kami mendefinisikan diri kami untuk mewakili operasi yang berbeda. Misalnya, antarmuka untuk menanyakan artikel di atas, kami mendefinisikan artikel/list.json untuk mewakili daftar artikel kueri, yang dapat diakses melalui metode GET atau POST. Desain API Restful menggunakan HTTP untuk mewakili operasi terkait CRUD. Oleh karena itu, selain mendapatkan dan memposting metode, metode HTTP lainnya juga digunakan, seperti put, hapus, kepala, dll., Untuk mewakili operasi dengan makna yang berbeda melalui metode HTTP yang berbeda. Di bawah ini adalah satu set API REST yang dirancang oleh saya untuk menambah, menghapus, memodifikasi, dan memeriksa artikel:
| URL antarmuka | Metode HTTP | Deskripsi Antarmuka |
| /artikel | POS | Simpan artikel |
| /artikel/{id} | MENDAPATKAN | Daftar Artikel Permintaan |
| /artikel/{id} | MENGHAPUS | Hapus artikel |
| /artikel/{id} | MELETAKKAN | Perbarui informasi artikel |
Dapat dilihat di sini bahwa URL hanyalah cara untuk mengidentifikasi sumber daya, dan perilaku spesifik ditentukan oleh metode HTTP.
Sekarang mari kita lihat cara menerapkan antarmuka di atas. Saya tidak akan banyak bicara tentang itu, lihat saja kodenya:
@Restcontroller @requestMapping ("/REST") kelas publik ArticlerestController {@Autowired Private ArtikelService ArtikelService; @RequestMapping (value = "/artikel", Method = Posting, menghasilkan = "Application/JSON") Public WebResponse <Map <String, Object >> SaveArticle (artikel @RequestBody artikel) {artikel.setUserId (1L); ArtikelService.Savearticle (artikel); Peta <String, Object> ret = HashMap baru <> (); ret.put ("id", artikel.getId ()); WebResponse <peta <string, objek >> respons = webResponse.getSucCessResponse (ret); respons pengembalian; } @RequestMapping (value = "/artikel/{id}", method = delete, menghasilkan = "Application/JSON") Public WebResponse <?> DeleteArticle (@PathVariable Long ID) {artikel artikel = artikelService.getById (id); artikel.setstatus (-1); ArtikelService.updateArticle (artikel); WebResponse <BOMPERTIF> Respons = WebResponse.getSucCessResponse (null); respons pengembalian; } @RequestMapping (value = "/artikel/{id}", method = put, menghasilkan = "Application/JSON") Public WebResponse <POMPERTIF> UpdateArticle (@PathVariable Long ID, artikel @RequestBody artikel) {artikel.setid (id); ArtikelService.updateArticle (artikel); WebResponse <BOMPERTIF> Respons = WebResponse.getSucCessResponse (null); respons pengembalian; } @RequestMapping (value = "/artikel/{id}", method = get, menghasilkan = "application/json") public webResponse <artikel> getarticle (@pathvariable long id) {artikel artikel = artikelService.getbyid (id); WebResponse <TARTICTER> Respons = WebResponse.getSucCessResponse (artikel); respons pengembalian; }}Mari kita analisis kode ini lagi. Perbedaan antara kode ini dan kode sebelumnya adalah:
(1) Kami menggunakan anotasi @RestController, bukan @Controller. Namun, anotasi ini juga tidak disediakan oleh Spring Boot, tetapi anotasi yang disediakan di Spring MVC4, yang menunjukkan pengontrol yang mendukung REST.
(2) Ada tiga peta URL di kelas ini yang sama, yaitu, mereka semua /artikel /{id}, yang tidak diizinkan muncul di kelas yang diidentifikasi oleh @Controller. Di sini, kita dapat membedakannya dengan metode. Fungsi produksi adalah untuk menunjukkan bahwa jenis hasil pengembalian adalah JSON.
(3) Anotasi @PathVariable juga disediakan oleh Spring MVC. Fungsinya adalah menunjukkan bahwa nilai variabel diperoleh dari jalur akses.
Jadi setelah semua, kode ini masih ada hubungannya dengan Spring Boot. Spring Boot hanya menyediakan fungsi konfigurasi otomatis, yang juga merupakan alasan penting mengapa Spring Boot sangat nyaman digunakan, karena sangat invasif dan pada dasarnya Anda tidak merasakan keberadaannya.
Setelah kode selesai, bagaimana cara mengujinya? Kecuali untuk metode GET, kami tidak dapat mengaksesnya langsung melalui browser. Tentu saja, kami dapat secara langsung mengirim berbagai permintaan HTTP melalui tukang pos. Namun, saya masih mendukung pengujian berbagai metode melalui kelas tes unit. Di sini kita akan menguji setiap metode melalui junit:
@Runwith (springjunit4classrunner.class) @springboottest (class = application.class) kelas publik articlecontrollerTest {@Autowired private articlerestController restcontroller; Private MockMVC MVC; @Before public void setup () melempar Exception {mvc = mockmvcbuilders.standAloneSetup (restcontroller) .build (); } @Test public void testAddarticle () melempar Exception {artikel artikel = artikel baru (); Artikel.Settitle ("Tes Artikel0000000"); Article.SetType (1); artikel.setstatus (2); Artikel.Setsummary ("Ini adalah artikel uji"); Gson gosn = GSON baru (); RequestBuilder Builder = mockMvcRequestBuilders .post ("/rest/artikel") .cepcept (mediatype.application_json) .contentType (mediatype.application_json_utf8) .content (gosn.tojson (artikel)); MVCRESULT hasil = mvc.Porm (builder) .AndReturn (); System.out.println (result.getResponse (). GetContentAsstring ()); } @Test public void testupDateArticle () melempar Exception {artikel artikel = artikel baru (); Article.settitle ("Perbarui Artikel Uji"); Article.SetType (1); artikel.setstatus (2); artikel.setsummary ("Ini adalah artikel uji pembaruan"); Gson gosn = GSON baru (); RequestBuilder Builder = mockMvcRequestBuilders .put ("/istirahat/artikel/1") .cepcept (mediatype.application_json) .contentType (mediatype.application_json_utf8) .content (gosn.tojson (artikel)); MVCRESULT hasil = mvc.Porm (builder) .AndReturn (); } @Test public void testQueryArticle () melempar Exception {requestBuilder builder = mockmvcRequestBuilders .get ("/rest/artikel/1") .cepcept (mediatype.application_json) .contentType (mediatype.application_json_utf8); MVCRESULT hasil = mvc.Porm (builder) .AndReturn (); System.out.println (result.getResponse (). GetContentAsstring ()); } @Test public void testDeleteArticle () melempar Exception {requestBuilder builder = mockmvcRequestBuilders .delete ("/rest/artikel/1") .cepcept (mediatype.application_json) .contentType (mediatype.application_json_utf8); MVCRESULT hasil = mvc.Porm (builder) .AndReturn (); }}Saya tidak akan memposting hasil eksekusi di sini. Jika Anda tertarik, Anda dapat bereksperimen dengannya sendiri. Masih ada sangat sedikit poin untuk dijelaskan di seluruh kelas. Alasan utama untuk hal -hal ini adalah bahwa mereka tidak ada hubungannya dengan boot musim semi. Alasan untuk mendukung operasi ini adalah untuk memperkenalkan starter yang sesuai yang disebutkan dalam artikel sebelumnya:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> spring-boot-starter-test </t Artifactid> <scope> tes </seupop> </dependency>
Karena permintaan HTTP akan dieksekusi, mockMVC digunakan di sini. ArticlerestController dipakai melalui injeksi dan tidak dapat langsung baru. Kalau tidak, ArticlerestController tidak dapat dikelola melalui wadah IOC musim semi, sehingga kelas lain yang tergantung pada tidak dapat disuntikkan secara normal. Melalui mockMVC, kami dapat dengan mudah menerapkan HTTP Delete/Put/Post dan metode lainnya.
Artikel ini menjelaskan bahwa jika Spring Boot digunakan untuk mengimplementasikan RESTful API, sebagian besar hal disediakan oleh Spring dan Spring MVC, dan Spring Boot hanya menyediakan fungsi konfigurasi otomatis. Namun, konfigurasi otomatis inilah yang mengurangi banyak pekerjaan pengembangan dan pemeliharaan bagi kami, memungkinkan kami untuk mengimplementasikan proyek web lebih sederhana dan efisien, sehingga kami dapat lebih fokus pada pengembangan bisnis itu sendiri tanpa peduli dengan kerangka kerja. Dalam artikel ini, kami menyebutkan bahwa kami dapat mengakses antarmuka yang tenang melalui tukang pos dan junit. Pada artikel berikutnya, kami akan memperkenalkan cara lain untuk mengaksesnya. Jika Anda tertarik, Anda dapat terus memperhatikan.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.