Feign的Post与Get如何多参数传递
程序员文章站
2022-04-15 23:09:39
在实际项目开发过程中,我们使用 Feign 实现服务与服务之间的调用 是在很多情况下,多参数传递是无法避免的 下面我们分两种情况,讨论如何在 GET POST 情况下,在 Web开发中 SpringMVC 支持 GET 法直接绑定 POJO ,但是 Fe ign 的实现并未覆盖所有 Spring MVC 的功能 ,目解决方式有很多,最常见的解决方式如下: 且把 POJO 拆散成一个一 独的属性放在方法参数里 口把方法参数 Map 传递 使用 GE 传递@RequestBody ,但此方....
在实际项目开发过程中,我们使用 Feign 实现服务与服务之间的调用 是在很多情
况下,多参数传递是无法避免的 下面我们分两种情况,讨论如何在 GET POST 情况下
,在 Web开发中 Spring MVC 支持 GET 法直接绑定 POJO ,但是 Fe ign
的实现并未覆盖所有 Spring MVC 的功能 ,目解决方式有很多,最常见的解决方式如下:
且把 POJO 拆散成一个一 独的属性放在方法参数里 口把方法参数 Map 传递
使用 GE 传递@RequestBody ,但此方式违反 Restful 规范
本案 中我们介绍 最佳的实践方式, 即通过 Feign 拦截器的方式处理
1.Feign拦截器代码如下:(消费端)
package com.kongliand.feign.intercept;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.*;
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Autowired
private ObjectMapper objectMapper;
@Override
public void apply(RequestTemplate template) {
//feign 不支持GET方法传POJO,json body 转query
if (template.method().equals("GET") && template.body() != null) {
try {
JsonNode jsonNode = objectMapper.readTree(template.body());
template.body("");
Map<String, Collection<String>> queries = new HashMap<>();
buildQuery(jsonNode, "", queries);
template.queries(queries);
} catch (IOException e) {
//提示:根据实践项目情况处理此处异常,这里不做扩展。
e.printStackTrace();
}
}
}
private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
if (!jsonNode.isContainerNode()) { // 叶子节点
if (jsonNode.isNull()) return;
Collection<String> values = queries.computeIfAbsent(path, k -> new ArrayList<>());
values.add(jsonNode.asText());
return;
}
if (jsonNode.isArray()) { // 数组节点
Iterator<JsonNode> it = jsonNode.elements();
while (it.hasNext()) {
buildQuery(it.next(), path, queries);
}
} else {
Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
while (it.hasNext()) {
Map.Entry<String, JsonNode> entry = it.next();
if (StringUtils.hasText(path))
buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
else // 根节点
buildQuery(entry.getValue(), entry.getKey(), queries);
}
}
}
}
2.消费端调用feign接口定义
package com.kongliand.feign.service;
import com.kongliand.feign.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "provider-service")
public interface UserFeignService {
@RequestMapping(value = "/user/add" ,method = RequestMethod.GET)
public String addUser( User user);
@RequestMapping(value = "/user/update",method = RequestMethod.POST)
public String updateUser(@RequestBody User user);
}
3.消费端调用controller
package com.kongliand.feign.controller;
import com.kongliand.feign.model.User;
import com.kongliand.feign.service.UserFeignService;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserFeignService userFeignService;
@RequestMapping(value = "/add",method = RequestMethod.POST)
public String addUser(@RequestBody @ApiParam(name = "用户",value = "传入json格式") User user){
return userFeignService.addUser(user);
}
@RequestMapping(value = "/update",method = RequestMethod.POST)
public String updateUser(@RequestBody @ApiParam(name = "用户",value = "传入json") User user){
return userFeignService.updateUser(user);
}
}
4.服务提供者provider-service
package com.kongliand.provider.controller;
import com.kongliand.provider.model.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/add")
public String addUser(User user){
return "hello,"+user.getName();
}
@RequestMapping("/update")
public String updateUser(@RequestBody User user){
return "hello,"+user.getName();
}
}
以上就可以多参数传递了。。。
本文地址:https://blog.csdn.net/kongliand/article/details/107469099
推荐阅读
-
JSP页面中文参数的传递(get和post方法分析)
-
Spring Cloud如何使用Feign构造多参数的请求
-
JSP页面中文参数的传递(get和post方法分析)
-
Spring Cloud如何使用Feign构造多参数的请求
-
关于post和get传递参数的区别
-
formaction中get\post传递参数的问题详解
-
Feign的Post与Get如何多参数传递
-
Node第3天知识点:在node当中使用art-template、处理GET方式传递的参数、处理POST方式传递数据、服务器端重定向、模块化
-
PHP如何过滤GET或者POST的参数?如何样才能保证代码不被注入
-
PHP如何过滤GET或者POST的参数?如何样才能保证代码不被注入