Eureka服务间feign请求(续)_2020.10.13

学习基于记录,而不止于记录。

希望自己能坚持下去~

0.写在前面

    又咕了好久啊,学如逆水行舟,不进则退。接好久之前的一篇散记Eureka服务间feign请求_2020.06.23

1.问题

之前曾经吐槽restTemplate请求,代码不够优雅,feign请求则更为规整,但是用着用着我就发现不对劲了,restTemplate可以将目标接口url作为参数请求,很容易就实现了动态接口请求,这对于feign来说可就费劲了,但是也有实现的方式。

2.feign的动态url请求

为了方便减少篇幅和不必要的废话,直接上代码(包含GET和POST两种请求)

2.1 接口编写

import com.wishoffice.platform.model.other.OperationResponse;
import com.wishoffice.platform.security.FeignHeaderInterceptor;
import feign.HeaderMap;
import feign.Param;
import feign.QueryMap;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.net.URI;
import java.util.Map;

@FeignClient(name = "wishClient")
public interface WishFeignClient {

    @RequestLine("GET /totalStartProcess?processDefinitionId={processDefinitionId}&czdh={czdh}")
    OperationResponse totalStartProcess(
            URI uri,
            @HeaderMap Map<String, Object> headerMap,
            @Param("processDefinitionId") String processDefinitionId,
            @Param("czdh") String czdh);

   @RequestLine("POST /services/sms/send")
    String sendSM(
            URI uri,
            @HeaderMap Map<String, Object> headerMap,
            @QueryMap Map<String, Object> bodyMap);
}

2.2 service包装类编写

import com.wishoffice.platform.model.other.OperationResponse;
import feign.Feign;
import feign.Target;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;

@Component
@Import(value = {FeignClientsConfiguration.class})
public class CallerService {

    private WishFeignClient wishFeignClient;

    @Autowired
    public CallerService(Decoder decoder, Encoder encoder) {
        wishFeignClient = Feign.builder()
                .encoder(encoder)
                .decoder(decoder)
                .target(Target.EmptyTarget.create(WishFeignClient.class));
    }

    public OperationResponse call(String url, Map<String, Object> headerMap, String processDefinitionId, String czdh) throws URISyntaxException {
        System.out.println("url:" + url);
        System.out.println("headerMap:" + headerMap);
        System.out.println("processDefinitionId:" + processDefinitionId);
        System.out.println("czdh:" + czdh);
        return wishFeignClient.totalStartProcess(new URI(url), headerMap, processDefinitionId, czdh);
    }

    public String sendSM(String url, Map<String, Object> headerMap, Map<String, Object> bodyMap) throws URISyntaxException {
        System.out.println("headerMap:" + headerMap);
        System.out.println("bodyMap:" + bodyMap);
        return wishFeignClient.sendSM(new URI(url), headerMap, bodyMap);
    }

}

2.3 根据业务需要入参调用

GET

        ProcessModel processModel = this.findByProcessDefinitionId(processDefinitionId);
        Map<String, Object> headerMap = new HashMap<>();
        headerMap.put(TokenUtil.AUTH_HEADER_NAME, TokenUtil.getToken(request));
        return callerService.call(processModel.getStartProcessUrl(),headerMap, processDefinitionId, czdh);

POST

        Map<String, Object> headerMap = new HashMap<>();
        headerMap.put("Content-Type", "application/json;charset=utf-8");
        Map<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("mobileNo", telNo);
        bodyMap.put("content", content);
        bodyMap.put("msgType", "1");
        bodyMap.put("verifyCode", String.valueOf(mobile_code));
        System.out.println("短信验证码开始请求...");
        String result = callerService.sendSM("http://172.16.90.85:10086", headerMap, bodyMap);
        System.out.println("短信验证码返回值:" + result);

3. 总结

    从上面来看,feign的动态url请求还是比较麻烦的,这一点也不知道后续版本更新有无优化的方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容