เมื่อเร็ว ๆ นี้ผู้คนมักถามสปริงคลาวด์แกล้งทำอย่างไรถึงจะอัปโหลดไฟล์ มีสมาชิกใหม่ของทีมและพี่น้องจาก บริษัท อื่น ๆ บทความนี้สรุปสั้น ๆ -
ในต้นฤดูใบไม้ผลิคลาวด์ Feign นั้นไม่มีความสามารถในการอัปโหลดไฟล์ (1 ปีที่ผ่านมา) เพื่อให้บรรลุเป้าหมายนี้คุณต้องเขียนตัวเข้ารหัสด้วยตัวเองเพื่อใช้การอัปโหลด ตอนนี้เรามีความสุขมากขึ้น เนื่องจาก Feign Official จัดให้มีการปลอมแปลงโครงการย่อยซึ่งใช้ตัวเข้ารหัสที่จำเป็นสำหรับการอัปโหลด
หมายเหตุ: เวอร์ชันที่ฉันทดสอบคือ edgware.release Camden และ Dalston ยังปรับตัวเข้ากับคำอธิบายในบทความนี้
เพิ่มการพึ่งพา
<การพึ่งพา> <roupId> io.github.openfeign.form </groupId> <ratifactId> feign-form </artifactid> <persion> 3.0.3 </เวอร์ชัน> </predency> <Sersion> 3.0.3 </Service> </dermentency>
การเขียนลูกค้าแสร้งทำเป็น
@feignClient (name = "ms-content-sample", configuration = uploadfeignlient.multipartsupportconfig.class) อินเตอร์เฟสสาธารณะ uploadfeignclient {@requestmapping (value = "/upload", method = requestmethod.post mediaType.multipart_form_data_value) @ResponseBody สตริง HandleFileUpload (@RequestPart (value = "ไฟล์") ไฟล์ MultipArtFile); คลาส MultipartSupportConfig {@Bean Public Encoder FeignFormenCoder () {ส่งคืน SpringFormenCoder ใหม่ (); -ตามที่รหัสแสดงในไคลเอนต์ Feign นี้เราอ้างอิงคลาสการกำหนดค่า MultipartSupportConfig และใน MultipartSupportConfig เราจะสร้างอินสแตนซ์ SpringFormenCoder วิธีนี้สามารถอัปโหลดไคลเอ็นต์ Feign ได้
บันทึก
@RequestMapping (value = "/upload", method = requestmethod.post, ผลิต = {mediaType.application_json_utf8_value}, ผู้บริโภค = mediaType.multipart_form_data_value) จะต้องไม่หายไป;คำอธิบายประกอบ @RequestPart (value = "ไฟล์") ในคำนิยามอินเตอร์เฟสไม่สามารถเขียนเป็น @RequestParam (value = "ไฟล์"
เป็นการดีที่สุดที่จะตั้งค่าการหมดเวลาของ Hystrix นานขึ้นเล็กน้อยเช่น 5 วินาทีมิฉะนั้น Hystrix อาจหมดเวลาก่อนที่ไฟล์จะถูกอัปโหลดส่งผลให้เกิดข้อผิดพลาดทางฝั่งไคลเอ็นต์
ข้อผิดพลาดของการใช้ Feign ใน SpringCloud
ตัวอย่างมีดังนี้:
@feignClient ("Service-resource") //@requestmapping ("/api/test") อินเตอร์เฟสสาธารณะ testResourceitg {@requestmapping (value = "/api/test/raw", method = requestmethod.post, ผู้บริโภค = "แอปพลิเคชัน/x-ww-form-urlencoded @RequestParam ("เนื้อหา") เนื้อหาสตริง); // เนื้อหา} ภาพประกอบ:
* ใช้การบริโภคในการร้องขอเพื่อระบุประเภทเนื้อหาของคำขอที่สร้างขึ้น
*พารามิเตอร์ที่ระบุโดย RequestParam จะถูกประกบหลังจาก URL เช่น:? name = xxx & age = 18
*พารามิเตอร์ PathVariable จะถูกส่งไปยัง LinkedHashMap <String,?> ลงในตัวเข้ารหัส Feign สำหรับการประมวลผล ตัวเข้ารหัสที่ใช้อินเทอร์เฟซนี้ในฤดูใบไม้ผลิคือ SpringenCoder และการใช้งานนี้จะใช้ httpmessageConverter ในฤดูใบไม้ผลิเพื่อเขียนเนื้อหาคำขอ
หลุม:
*อย่าใช้การใช้งาน Mapping ในชื่อคลาสอินเตอร์เฟส แม้ว่าจะสามารถใช้งานได้ SpringMVC จะเปิดอินสแตนซ์ของอินเทอร์เฟซเป็นคอนโทรลเลอร์ สามารถดูได้ในบันทึกการแมปเริ่มต้น
*ใช้ SpringenCoder เริ่มต้นเมื่อไม่ได้ระบุการบริโภคพารามิเตอร์ใน pathVariable จะสร้างสตริง JSON เพื่อส่งและวิธีการสร้างแบบฟอร์มไม่ได้รับการสนับสนุนโดยค่าเริ่มต้น เหตุผลก็คือ formhttpmessageConverter สามารถจัดการ multivalueMap ได้เท่านั้นในขณะที่การใช้พารามิเตอร์ pathvariable จะถูกวางไว้ใน HASHMAP การอัปโหลดไฟล์ไม่รองรับโดยค่าเริ่มต้น ในความเป็นจริงมี httpmessageconverter อยู่แล้วที่สนับสนุนการจัดการสถานการณ์ต่าง ๆ
เติมในหลุม:
*การส่งแบบฟอร์มการสนับสนุนแบบฟอร์ม: คุณจะต้องเขียน formhttpmessageConverter ที่รองรับแผนที่เท่านั้น คุณสามารถเรียกวิธีการของ FormhttpMessageConverter ภายในเพื่อให้การดำเนินงานง่ายขึ้น
*การอัปโหลดไฟล์สนับสนุน: เพียงแค่ห่อหุ้มไฟล์ที่จะอัปโหลดลงในทรัพยากร (ทรัพยากรจะต้องใช้อินเทอร์เฟซชื่อไฟล์ซึ่งเป็นตัวระบุการแยกวิเคราะห์พารามิเตอร์การร้องขอลงในไฟล์) และใช้ทรัพยากรเริ่มต้น
*รองรับการจัดการพารามิเตอร์ MultipartFile: เพียงแค่เขียน MultipartFilehttpMessageConverter ที่รองรับ MultipartFile คุณสามารถเรียกใช้ ResourcehttpmessageConverter ภายใน ในเวลาเดียวกันโปรดทราบว่าจำเป็นต้องเพิ่มในส่วนของ formhttpmessageConverter และเขียนวิธี getFilename ใหม่ของ formhttpmessageConverter เพื่อรองรับชื่อไฟล์จาก MultipartFile
*HTTPMESSAGECONVERTER ทั้งหมดสามารถสร้างได้โดยตรงในโหมด @Bean และสปริงจะรับรู้และเพิ่มโดยอัตโนมัติ
การสนับสนุนที่สมบูรณ์แบบสำหรับการอัปโหลดแบบฟอร์มและไฟล์:
แผน 1:
ใช้ mapformhttpmessageConverter.java และ multipartfilehttpmessageconverter.java ในไฟล์แนบ
สร้างการกำหนดค่าต่อไปนี้ในฤดูใบไม้ผลิ
@BeanPublic MAPFORMHTTPMESSAGECONVERTER MAPFORMHTTPMESSAGECONVERTER (MULTIPARTFILEHTTPMESSAGECONVERTER MULTIPARTFILEHTTPMESSAGECONVERTER) MapFormhttpMessageConverter.addpartConverter (MultipArtFileHttpMessageConverter); ส่งคืน mapformhttpmessageConverter;}@beanpublic multipartfilehttpmessageConverter multipartfilehttpmessageconverter () {ส่งคืน multipartfilehttpmessageConverter ();};};};};};};};};}; แผน 2:
ใช้ feignspringformencoder.java
ในฤดูใบไม้ผลิกำหนดค่าดังนี้:
@BeanPublic ENCODER FEIGNENCODER (ObjectFactory <httpMessageConverters> MessageConverters) {ส่งคืน FeignSpringFormenCoder ใหม่ (MessageConverters);} แผนการใช้งานแนะนำ 1
แผน 2 สำหรับการอ้างอิง https://github.com/pcan/feign-client-test, ยังไม่ได้ทดสอบ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น