บทความก่อนหน้านี้อธิบายถึงการรวมการบูตสปริงกับ JDBCTEMPLATE, JPA และ MyBatis เพื่อให้เข้าถึงฐานข้อมูล วันนี้ฉันจะแบ่งปันวิธีการส่งคืนข้อมูลไปยังส่วนหน้าผ่าน Spring Boot เป็นหลัก
ในกระบวนการพัฒนาปัจจุบันเพื่อเพิ่มการแยกส่วนด้านหน้าและด้านหลังให้สูงสุดอินเตอร์เฟสแบ็กเอนด์มักจะให้เฉพาะอินเทอร์เฟซข้อมูลและส่วนหน้าจะได้รับข้อมูลจากแบ็กเอนด์ผ่านคำขอ AJAX และแสดงผลให้ผู้ใช้ วิธีที่พบบ่อยที่สุดที่เราใช้คือแบ็กเอนด์จะส่งคืนสตริง JSON ไปยังส่วนหน้าและส่วนหน้าจะวิเคราะห์สตริง JSON เพื่อสร้างวัตถุ JavaScript แล้วประมวลผล บทความนี้จะแสดงให้เห็นว่า Spring Boot ใช้โมเดลนี้อย่างไร บทความนี้จะมุ่งเน้นไปที่วิธีการออกแบบ API restful และใช้ APIs ที่เกี่ยวข้องผ่าน Spring Boot อย่างไรก็ตามเพื่อให้ทุกคนเข้าใจ API สไตล์พักผ่อนได้ดีขึ้นเราจะออกแบบอินเทอร์เฟซส่งคืนข้อมูลแบบดั้งเดิมก่อนเพื่อให้ทุกคนสามารถเข้าใจได้ในการเปรียบเทียบ
ลองใช้รายการบทความเป็นตัวอย่างในการใช้อินเทอร์เฟซที่ส่งคืนรายการบทความรหัสมีดังนี้:
@Controller @RequestMapping ("/บทความ") Public Class ArticleController {@AutoWired Articlementservice ArticleService; @RequestMapping ("/list.json") @ResponseBody รายการสาธารณะ <บทความ> listArticles (ชื่อสตริง, จำนวนเต็ม pagesize, จำนวนเต็ม pagenum) {ถ้า (pagesize == null) {pagesize = 10; } if (pagenum == null) {pagenum = 1; } int offset = (pagenum - 1) * pagesize; return articleservice.getarticles (ชื่อ, 1l, ชดเชย, หน้า); -การดำเนินการของ Articleservice นั้นง่ายมากซึ่งเพียงแค่ห่อหุ้มการทำงานของ Articlemapper คุณสามารถอ้างถึงบทความก่อนหน้า ระดับการใช้งานของบริการบทความมีดังนี้:
@ServicePublic Class CLANTICLATIONSERVICICEMPL ใช้บทความ VASTICLESSERVICE {@AUTOWIRED ARTICLEMAPPER ARTICLEMAPPER; @Override Public Long SaveArticle (บทความบทความ @requestbody บทความ) {return articlemapper.insertarticle (บทความ); } @Override รายการสาธารณะ <บทความ> getArticles (ชื่อสตริง, userId ยาว, int offset, หน้า int) {บทความบทความ = บทความใหม่ (); บทความ Settitle (ชื่อ); บทความ SetUserID (USERID); return articlemapper.queryarticlesBypage (บทความ, ชดเชย, หน้า); } @Override บทความสาธารณะ getById (Long ID) {return articleMapper.QueryById (ID); } @Override โมฆะสาธารณะ updateArticle (บทความบทความ) {places.setUpDateTime (วันที่ใหม่ ()); articlemapper.updatearticleByid (บทความ); -เรียกใช้คลาส Application.java จากนั้นเยี่ยมชม: http: // locahost: 8080/บทความ/list.json คุณสามารถดูผลลัพธ์ต่อไปนี้:
ArticleServiceImpl เป็นคลาสธรรมดามากโดยมีคำอธิบายประกอบฤดูใบไม้ผลิเพียงหนึ่งเดียว @Service ซึ่งระบุว่าเป็นถั่วเพื่อการจัดการที่ง่ายผ่านภาชนะ IOC ฤดูใบไม้ผลิ มาดูชั้นเรียนของ ArticleController ในความเป็นจริงผู้ที่ใช้ MVC ฤดูใบไม้ผลิควรคุ้นเคยกับคำอธิบายประกอบเหล่านี้ นี่คือคำอธิบายสั้น ๆ :
@Controller ระบุคลาสเป็นคอนโทรลเลอร์
@RequestMapping URL Mapping
@ResponseBody ส่งคืนผลลัพธ์ที่แปลงเป็นสตริง JSON
@requestbody หมายถึงการรับพารามิเตอร์สตริงรูปแบบ JSON
ด้วยคำอธิบายประกอบทั้งสามนี้เราสามารถใช้ฟังก์ชั่นการส่งคืนข้อมูลรูปแบบ JSON ไปยังส่วนหน้าผ่าน URL ได้อย่างง่ายดาย แต่ทุกคนต้องสับสนเล็กน้อย สิ่งเหล่านี้มาจาก Spring MVC หรือไม่? มันเกี่ยวข้องกับการบูตสปริงอะไร? ในความเป็นจริงฟังก์ชั่นของการบูตสปริงคือการบันทึกกระบวนการกำหนดค่าให้เรา ฟังก์ชั่นอื่น ๆ มีให้โดย MVC ฤดูใบไม้ผลิและฤดูใบไม้ผลิสำหรับเรา ทุกคนควรจำไว้ว่า Spring Boot ให้บริการการกำหนดค่าอัตโนมัติผ่านการเริ่มต้นต่างๆ การพึ่งพานี้ได้รับการแนะนำในโครงการของเราก่อน:
<การพึ่งพา> <roupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </artifactId>
นี่คือแพ็คเกจ JAR ที่ต้องมีการแนะนำโครงการสปริงบูตเว็บทั้งหมด กล่าวคือตราบใดที่โครงการสปริงบูตเว็บสนับสนุนฟังก์ชั่นข้างต้นโดยค่าเริ่มต้น ที่นี่เราพบว่าการพัฒนาวิศวกรรมเว็บผ่าน Spring Boot ช่วยให้เราประหยัดการกำหนดค่าได้มากมาย
โอเคลองมาดูกันว่าจะใช้ API ที่เหลือได้อย่างไร ในความเป็นจริง Restful ตัวเองไม่ใช่เทคโนโลยีที่ลึกซึ้ง แต่เป็นเพียงสไตล์การเขียนโปรแกรมหรือสไตล์การออกแบบ ในการออกแบบอินเทอร์เฟซ HTTP แบบดั้งเดิมโดยทั่วไปเราใช้วิธีการรับและโพสต์เท่านั้นจากนั้นใช้คำศัพท์ที่เรากำหนดตัวเองเพื่อแสดงการดำเนินการที่แตกต่างกัน ตัวอย่างเช่นอินเทอร์เฟซสำหรับการสอบถามบทความด้านบนเรากำหนดบทความ/list.json เพื่อแสดงรายการบทความสอบถามซึ่งสามารถเข้าถึงได้ผ่านวิธีการรับหรือโพสต์ การออกแบบ API RESTFUL ใช้ HTTP เพื่อแสดงถึงการดำเนินงานที่เกี่ยวข้องกับ CRUD ดังนั้นนอกเหนือจากวิธีการรับและโพสต์แล้วยังใช้วิธีการ HTTP อื่น ๆ เช่น Put, Delete, Head, ฯลฯ เพื่อแสดงถึงการทำงานที่มีความหมายที่แตกต่างกันผ่านวิธี HTTP ที่แตกต่างกัน ด้านล่างนี้เป็นชุดของ APIs restful ที่ออกแบบโดยฉันสำหรับการเพิ่มลบการแก้ไขและตรวจสอบบทความ:
| URL อินเตอร์เฟส | วิธี HTTP | คำอธิบายอินเตอร์เฟส |
| /บทความ | โพสต์ | บันทึกบทความ |
| /บทความ/{id} | รับ | รายการบทความสอบถาม |
| /บทความ/{id} | ลบ | ลบบทความ |
| /บทความ/{id} | ใส่ | อัปเดตข้อมูลบทความ |
จะเห็นได้ที่นี่ว่า URL เป็นเพียงวิธีการระบุทรัพยากรและพฤติกรรมเฉพาะถูกระบุโดยวิธี HTTP
ทีนี้มาดูวิธีการใช้อินเทอร์เฟซด้านบน ฉันจะไม่พูดอะไรมากมายเกี่ยวกับเรื่องนี้เพียงแค่ดูรหัส:
@restcontroller @requestmapping ("/rest") ชั้นเรียนสาธารณะ ArticlerestController {@autowired Articlementservice ArticleService; @RequestMapping (value = "/บทความ", method = post, produces = "application/json") webresponse สาธารณะ <แผนที่ <String, Object >> SaveArticle (@requestbody บทความบทความ) articleservice.savearticle (บทความ); แผนที่ <สตริงวัตถุ> ret = ใหม่ hashmap <> (); ret.put ("id", article.getId ()); WebResponse <MAP <String, Object >> Response = WebResponse.getSuccessResponse (ret); การตอบกลับกลับ; } @RequestMapping (value = "/บทความ/{id}", method = delete, produces = "application/json") webresponse สาธารณะ <?> deletearticle (@PathVariable Long ID) {บทความบทความ = บทความ บทความ SetStatus (-1); ArticleService.UpDateArticle (บทความ); WebResponse <Object> Response = WebResponse.getSuccessResponse (NULL); การตอบกลับกลับ; } @RequestMapping (value = "/บทความ/{id}", method = put, produces = "application/json") webresponse สาธารณะ <Public> updateArticle (@PathVariable Long ID, บทความบทความ) ArticleService.UpDateArticle (บทความ); WebResponse <Object> Response = WebResponse.getSuccessResponse (NULL); การตอบกลับกลับ; } @RequestMapping (value = "/บทความ/{id}", method = get, produces = "application/json") webresponse สาธารณะ <บทความ> getarticle (@PathVariable Long ID) {บทความบทความ = บทความ WebResponse <sarticle> Response = WebResponse.getSuccessResponse (บทความ); การตอบกลับกลับ; -มาวิเคราะห์รหัสนี้อีกครั้ง ความแตกต่างระหว่างรหัสนี้และรหัสก่อนหน้าคือ:
(1) เราใช้คำอธิบายประกอบ @RestController ไม่ใช่ @Controller อย่างไรก็ตามคำอธิบายประกอบนี้ยังไม่ได้รับจาก Spring Boot แต่มีคำอธิบายประกอบใน Spring MVC4 ซึ่งบ่งบอกถึงคอนโทรลเลอร์ที่รองรับการพักผ่อน
(2) มีแผนที่ URL สามตัวในคลาสนี้ที่เหมือนกันนั่นคือพวกเขาทั้งหมด /บทความ /{id} ซึ่งไม่ได้รับอนุญาตให้ปรากฏในคลาสที่ระบุโดย @Controller ที่นี่เราสามารถแยกแยะได้ด้วยวิธีการ ฟังก์ชั่นของการผลิตคือการระบุว่าประเภทของผลตอบแทนคือ JSON
(3) คำอธิบายประกอบ @PathVariable นั้นมีให้โดย Spring MVC ฟังก์ชั่นของมันคือการระบุว่าค่าของตัวแปรได้มาจากเส้นทางการเข้าถึง
ดังนั้นรหัสนี้ยังคงมีส่วนเกี่ยวข้องกับการบูตสปริงเพียงเล็กน้อย Spring Boot มีฟังก์ชั่นการกำหนดค่าอัตโนมัติเท่านั้นซึ่งเป็นเหตุผลสำคัญว่าทำไม Spring Boot จึงใช้งานได้สะดวกมากเพราะมันมีการรุกรานมากและโดยทั่วไปคุณจะไม่รู้สึกว่ามีอยู่
หลังจากรหัสเสร็จสิ้นแล้วให้ทดสอบอย่างไร? ยกเว้นวิธีการรับเราไม่สามารถเข้าถึงได้โดยตรงผ่านเบราว์เซอร์ แน่นอนว่าเราสามารถส่งคำขอ HTTP ต่างๆผ่านทางไปรษณีย์ได้โดยตรง อย่างไรก็ตามฉันยังคงสนับสนุนการทดสอบวิธีการต่าง ๆ ผ่านคลาสทดสอบหน่วย ที่นี่เราจะทดสอบแต่ละวิธีผ่าน Junit:
@runwith (springjunit4classrunner.class) @springboottest (classes = application.class) Public Class ArticleControllerTest {@autowired Private ArticlerestController RestController; MOCKMVC ส่วนตัว MVC; @Before โมฆะสาธารณะการตั้งค่า () พ่นข้อยกเว้น {mvc = mockmvcbuilders.standalonesetup (restcontroller) .build (); } @Test โมฆะสาธารณะ TestAdDarticle () โยนข้อยกเว้น {บทความบทความ = บทความใหม่ (); บทความ Settitle ("ทดสอบบทความ 0000000"); บทความ SetType (1); บทความ SetStatus (2); บทความ. setsummary ("นี่คือบทความทดสอบ"); GSON GOSN = New GSON (); Builder RequestBuilder = MockMvCreQuestBuilders .post ("/rest/article") .Accept (MediaType.Application_JSON) .ContentType (MediaType.Application_JSON_UTF8). ผลลัพธ์ mvcresult = mvc.perform (builder) .andreturn (); System.out.println (result.getResponse (). getContentAstString ()); } @Test โมฆะสาธารณะ TestUpDateArticle () โยนข้อยกเว้น {บทความบทความ = บทความใหม่ (); บทความ SETTITLE ("UPDATE TEST PARTER"); บทความ SetType (1); บทความ SetStatus (2); บทความ. setsummary ("นี่คือบทความทดสอบการอัปเดต"); GSON GOSN = New GSON (); Builder RequestBuilder = MockMvCreQuestBuilders .put ("/rest/article/1") .accept (mediaType.Application_json) .ContentType (MediaType.Application_JSON_UTF8). ผลลัพธ์ mvcresult = mvc.perform (builder) .andreturn (); } @Test Public Void TestQueryArticle () พ่นข้อยกเว้น {requestBuilder builder = MockMvCrequestBuilders .get ("/ส่วนที่เหลือ/บทความ/1") .Ccept (mediaType.application_json) .contenttype ผลลัพธ์ mvcresult = mvc.perform (builder) .andreturn (); System.out.println (result.getResponse (). getContentAstString ()); } @Test โมฆะสาธารณะ testDeleTearticle () พ่นข้อยกเว้น {requestBuilder builder = mockMvCrequestBuilders .Delete ("/ส่วนที่เหลือ/บทความ/1") .ccept (mediaType.application_json) .contenttype ผลลัพธ์ mvcresult = mvc.perform (builder) .andreturn (); -ฉันจะไม่โพสต์ผลการดำเนินการที่นี่ หากคุณสนใจคุณสามารถทดลองด้วยตัวเอง ยังมีอีกไม่กี่จุดที่จะอธิบายในชั้นเรียนทั้งหมด เหตุผลหลักสำหรับสิ่งเหล่านี้คือพวกเขาไม่มีส่วนเกี่ยวข้องกับการบูตฤดูใบไม้ผลิ เหตุผลในการสนับสนุนการดำเนินงานเหล่านี้คือการแนะนำผู้เริ่มต้นที่เกี่ยวข้องที่กล่าวถึงในบทความก่อนหน้า:
<Effercy> <mergiED> org.springframework.boot </groupId> <ratifactid> การทดสอบสปริง-สตาร์สตาร์เทสต์ </artifactid>
เนื่องจากคำขอ HTTP จะถูกดำเนินการจึงใช้ mockMVC ที่นี่ ArticlerestController เป็นอินสแตนซ์ผ่านการฉีดและไม่สามารถใหม่ได้โดยตรง มิฉะนั้น ARTICLERESTCONTROLLER ไม่สามารถจัดการได้ผ่านคอนเทนเนอร์ IOC ฤดูใบไม้ผลิดังนั้นคลาสอื่น ๆ ที่ขึ้นอยู่กับไม่สามารถฉีดได้ตามปกติ ผ่าน MockMVC เราสามารถใช้ HTTP DELETE/POT/POST และวิธีการอื่น ๆ ได้อย่างง่ายดาย
บทความนี้อธิบายว่าหากใช้สปริงบูตเพื่อใช้งาน RESTFUL API สิ่งส่วนใหญ่จะจัดทำโดยสปริงและสปริง MVC และสปริงบูตมีฟังก์ชั่นการกำหนดค่าอัตโนมัติเท่านั้น อย่างไรก็ตามมันคือการกำหนดค่าอัตโนมัติที่ช่วยลดการพัฒนาและการบำรุงรักษาจำนวนมากสำหรับเราทำให้เราสามารถใช้โครงการเว็บได้อย่างง่ายดายและมีประสิทธิภาพมากขึ้นเพื่อให้เราสามารถมุ่งเน้นการพัฒนาธุรกิจของตัวเองได้มากขึ้นโดยไม่ต้องดูแลกรอบ ในบทความนี้เรากล่าวว่าเราสามารถเข้าถึงอินเทอร์เฟซ RESTful ผ่าน Postman และ Junit ในบทความถัดไปเราจะแนะนำวิธีอื่นในการเข้าถึง หากคุณสนใจคุณสามารถให้ความสนใจต่อไป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น