Feign 访问远程api,动态指定url

springcloud 中的 feign 组件不仅能结合 eureka 实现springCloud内部的访问,还可以单独使用实现类似 httpClient 的功能,或者说 feign 其实就是一个简化版的 httpClient 。

-------   最后面附上源码 -------

 首先是 pom.xml 文件:

springboot 和 springcloud 的版本

2.1.4.RELEASE
.
.
.
Greenwich.SR1

 

关键引入:


    org.springframework.cloud
    spring-cloud-starter-openfeign

feign 接口:

package com.demo.carlton.feign;

import org.springframework.cloud.openfeign.FeignClient;
import com.demo.carlton.entity.User;

import feign.Param;
import feign.RequestLine;

/**
* 
* 

Title: TestFeign.java

* @author Carlton * @date 2019年4月29日 上午9:26:36 */ @FeignClient(name = "just-a-name") public interface TestFeign { @RequestLine("POST /getUser2?id={id}") public User getUser(@Param("id") int id); }

注意,接口上应使用 注解 @RequestLine,参数里应按指定格式,写明访问类型(POST/GET/...),以及url和参数

然后是调用方:

package com.demo.carlton.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.context.annotation.Import;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.demo.carlton.entity.FeignBean;
import com.demo.carlton.entity.User;
import com.demo.carlton.feign.TestFeign;

import feign.Feign;
import feign.Feign.Builder;
import feign.Request.Options;
import feign.Retryer;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;

/**
* 
* 

Title: TestController.java

* @author Carlton * @date 2019年4月29日 上午9:38:01 */ @RestController // 【1】import FeignClientsConfiguration.class @Import(FeignClientsConfiguration.class) public class TestController { // 不需要 @Autowired TestFeign testFeign; // 【2】 构造函数添加 @Autowired ,注入encoder,decoder,构建 TestFeign @Autowired public TestController(FeignBean feignBean, Encoder encoder, Decoder decoder) { // options方法指定连接超时时长及响应超时时长,retryer方法指定重试策略 Builder builder = Feign.builder(); // 设置http basic验证 builder = builder.contract(new feign.Contract.Default()).requestInterceptor( new BasicAuthRequestInterceptor(feignBean.getAdminName(), feignBean.getAdminPassword())); // 【3】设置编码,不然会报错feign.codec.EncodeException builder = builder.encoder(encoder).decoder(decoder); // options方法指定连接超时时长及响应超时时长,retryer方法指定重试策略 builder = builder.options(new Options(feignBean.getOpion_conn(), feignBean.getOpion_read())) .retryer(new Retryer.Default(feignBean.getRetry_period(), feignBean.getRetry_maxPeriod(), feignBean.getRetry_maxAttempts())); // 【4】 target 链接目标feing,并指定访问域名 testFeign = builder.target(TestFeign.class, feignBean.getUrl()); System.out.println(000); } @PostMapping("/getUser") public User getUser(@RequestParam(defaultValue = "1") int id) { System.out.println("id=" + id); User user = testFeign.getUser(id); return user; } @PostMapping("/getUser2") public User getUser2(@RequestParam(defaultValue = "1") int id) { System.out.println("id=" + id); User user = new User(id, "my name " + id, (id * 10)); return user; } }

如上标注,要注意的几个关键点:

1. import feign配置类,FeignClientsConfiguration.class

2.构造函数中用 @Autowired 引入自定义参数和编解码器

3.如果有http访问验证的需求也是这里添加

4.用builder.target()方法连接目标接口和指定的url,当然这里也可以不指定url:

import feign.Target;

//不指定url
testFeign = builder.target(Target.EmptyTarget.create(TestFeign.class));

//在接口中指定
@RequestLine("POST /getUser2?id={id}")
public User getUser(URI uri, @Param("id") int id);

大功告成。

 

https://gitee.com/carltonq/test-feign.git

你可能感兴趣的:(springboot,feign)