網(wǎng)站做跳轉(zhuǎn)對(duì)排名有影響嗎/網(wǎng)絡(luò)營(yíng)銷(xiāo)的基本內(nèi)容有哪些
feign技巧 - form方式傳值。
0. 文章目錄
- 1. 前言
- 2. 調(diào)用樣例
- 3. 原理解析
- 3.1 feign端序列化參數(shù)
- 3.2 SpringMVC服務(wù)端解析參數(shù)
- 3.3 補(bǔ)充 - 繼承關(guān)系不會(huì)被傳遞的原因
- 3.4 補(bǔ)充 - 不能使用GET。
- 4. 總結(jié)
1. 前言
直接正題。 如何使用feign進(jìn)行fom表單方式的請(qǐng)求調(diào)用,以及其中的注意事項(xiàng)。
2. 調(diào)用樣例
// =============================================== feign調(diào)用端// 注意事項(xiàng):// 1. 兩個(gè)參數(shù)都要使用@RequestPart注解進(jìn)行標(biāo)注.// 2. consumes屬性配置為必選.// 3. 代表參數(shù)載體對(duì)象的params字段, 不能存在繼承關(guān)系, 所有字段都必須直接定義在KDeployParams中. 如果存在基類(lèi), 那么處理流程中,只有在`KDeployParams`中直接定義的字段才能被正確解析并傳遞給服務(wù)端,基類(lèi)的字段不會(huì)被feign解析傳遞. @PostMapping(value = "/projectB/postWithFormData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)String postWithFormData(@RequestPart("file") MultipartFile file, @RequestPart KDeployParams params);// =============================================== 對(duì)應(yīng)的服務(wù)端 // 注意事項(xiàng):// 1. 第二個(gè)參數(shù)params前面沒(méi)有任何注解, 或者使用@ModelAttribute。千萬(wàn)不要使用@RequestPart.@PostMapping("/projectB/postWithFormData")public String postWithFormData(@RequestPart(required = false, name = "file") MultipartFile file,KDeployParams params) throws InterruptedException, IOException { ... }
3. 原理解析
分為兩部分 —— 發(fā)送端的feign,以及服務(wù)端的SpringMVC。
3.1 feign端序列化參數(shù)
整條請(qǐng)求鏈路中,feign端的調(diào)用層級(jí)最終會(huì)來(lái)到位于feign-form-xx.jar中的MultipartFormContentProcessor.process (...)
。
3.2 SpringMVC服務(wù)端解析參數(shù)
針對(duì)上文例子中,在服務(wù)端接收層面,SpringMVC中負(fù)責(zé)傳遞過(guò)來(lái)的參數(shù)還原/反序列化為KDeployParams
的是ServletModelAttributeMethodProcessor
(該類(lèi)實(shí)現(xiàn)了大名鼎鼎的HandlerMethodArgumentResolver
)。
3.3 補(bǔ)充 - 繼承關(guān)系不會(huì)被傳遞的原因
PojoUtil的坑,下面這里只會(huì)檢索出當(dāng)前類(lèi)直接聲明的字段。
3.4 補(bǔ)充 - 不能使用GET。
否則報(bào)如下錯(cuò)誤:
4. 總結(jié)
神在細(xì)節(jié)之中。
細(xì)節(jié)是魔鬼。