ในส่วนนี้เราจะสำรวจวิธีการสร้างคำขอหลายพารามิเตอร์โดยใช้ Feign ผู้เขียนใช้คำขอของวิธีการรับและโพสต์เป็นตัวอย่างเพื่ออธิบาย หลักการร้องขอของวิธีการอื่น ๆ (เช่นการลบ, ใส่ ฯลฯ ) เหมือนกันและผู้อ่านสามารถศึกษาได้ด้วยตนเอง
รับคำขอ URL พารามิเตอร์หลายตัว
สมมติว่า URL ที่เราร้องขอมีพารามิเตอร์หลายตัวเช่น http: // microservice-provider-user/get? id = 1 & username = Zhang San วิธีสร้างมันอย่างไร?
เรารู้ว่า Spring Cloud ได้เพิ่มการสนับสนุนคำอธิบายประกอบ MVC ในฤดูใบไม้ผลิเพื่อแสร้งทำเป็นดังนั้นเราอาจลองใช้ตามวิธีการเขียนของ Spring MVC:
@FeIgnClient ("Microservice-Provider-user") อินเตอร์เฟสสาธารณะ userfeignClient {@requestmapping (value = "/get", method = requestMethod.get) ผู้ใช้สาธารณะ get0 (ผู้ใช้ผู้ใช้);}อย่างไรก็ตามวิธีการเขียนนี้ไม่ถูกต้องและคอนโซลจะส่งออกข้อยกเว้นคล้ายกับต่อไปนี้
feign.feignexception: สถานะ 405 การอ่าน userfeignlient#get0 (ผู้ใช้); เนื้อหา:
{"timestamp": 1482676142940, "สถานะ": 405, "ข้อผิดพลาด": "ไม่อนุญาตให้ใช้วิธี", "ข้อยกเว้น": "org.springframework.web.httprequestmethodnotsupportedException"
จากข้อยกเว้นเราจะเห็นได้ว่าแม้ว่าเราจะระบุวิธี GET แต่ Feign จะยังคงใช้วิธีการโพสต์เพื่อส่งคำขอ
วิธีที่ถูกต้องในการเขียนมีดังนี้:
(1) วิธีการ 1
@feignClient (name = "microservice-provider-user") อินเตอร์เฟสสาธารณะ userfeignlient {@requestmapping (value = "/get", method = requestMethod.get) ผู้ใช้สาธารณะ get1 (@requestparam ("ID")นี่เป็นวิธีที่ใช้งานง่ายที่สุด URL มีพารามิเตอร์หลายอย่างและวิธีการในอินเทอร์เฟซแกล้งมีพารามิเตอร์หลายตัว ใช้คำอธิบายประกอบ @requestparam เพื่อระบุว่าพารามิเตอร์ที่ร้องขอคืออะไร
(2) วิธีการ 2
URL หลายพารามิเตอร์สามารถสร้างได้โดยใช้ MAP เมื่อมีพารามิเตอร์ URL เป้าหมายจำนวนมากวิธีนี้สามารถใช้เพื่อทำให้การเขียนของอินเทอร์เฟซแสร้งง่ายขึ้น
@feignClient (name = "microservice-provider-user") อินเตอร์เฟสสาธารณะ userfeignlient {@requestmapping (value = "/get", method = requestMethod.get) ผู้ใช้สาธารณะ get2 (@requestparam map <String, Object> Map);เมื่อโทรคุณสามารถใช้รหัสคล้ายกับต่อไปนี้
ผู้ใช้สาธารณะได้รับ (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง) {hashmap <สตริง, วัตถุ> map = maps.newhashmap (); map.put ("id", "1"); map.put ("ชื่อผู้ใช้", "จางซาน"); ส่งคืนสิ่งนี้ userfeignlient.get2 (แผนที่);} คำขอโพสต์มีพารามิเตอร์หลายตัว
มาพูดคุยเกี่ยวกับวิธีการสร้างคำขอโพสต์ที่มีพารามิเตอร์หลายตัวโดยใช้ Feign สมมติว่าคอนโทรลเลอร์ของผู้ให้บริการเขียนขึ้นเช่นนี้:
@RestControllerPublic คลาส userController {@postmapping ("/post") โพสต์ผู้ใช้สาธารณะ (@requestbody ผู้ใช้ผู้ใช้) {... }}เราจะใช้ Feign เพื่อขอได้อย่างไร? คำตอบนั้นง่ายมากตัวอย่าง:
@feignClient (name = "microservice-provider-user") อินเตอร์เฟสสาธารณะ userfeignlient {@requestmapping (value = "/post", method = requestMethod.post) ผู้ใช้สาธารณะ (@requestbody ผู้ใช้ผู้ใช้);} เคล็ดลับ
(1) สำหรับรายละเอียดโปรดดูโครงการ Microservice-Provider-user-Multiple-Params และโครงการ Microservice-Consumer-Movie-Feign-Multiple-Params ในรหัสประกอบของหนังสือเล่มนี้
(2) นอกเหนือจากวิธีการที่อธิบายไว้ในส่วนนี้เรายังสามารถเขียนตัวเข้ารหัสของเราเองเพื่อสร้างคำขอหลายพารามิเตอร์ แต่วิธีนี้มีต้นทุนการเข้ารหัสที่สูงขึ้นและลดความสามารถในการใช้รหัสที่ต่ำกว่า ดังนั้นหนังสือเล่มนี้จะไม่ถูกทำซ้ำ
การอ่านขยาย
(1) ฉันหวังว่า Feign สามารถสนับสนุนคำขอพารามิเตอร์เพื่อใช้ปัญหาของ POJO: https://github.com/spring-cloud/spring-cloud-netflix/issues/1253
(2) ปัญหาแนะนำให้ใช้คำอธิบายประกอบดั้งเดิม: https://github.com/spring-cloud/spring-cloud-netflix/issues/659
(3) ขอแนะนำให้ปรับปรุงการทำงานของ Feign: https://github.com/spring-cloud/spring-cloud-netflix/issues/1360
(4) ขอแนะนำให้สนับสนุนหน่วยงานขอเลือก (ปัจจุบัน Feign จะรายงานข้อยกเว้นเมื่อโพสต์ null): https://github.com/spring-cloud/spring-cloud-netflix/issues/1047
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น