欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

相关标签: 开发问题集锦