(已解决)如何在调用fegin接口时设置请求头header和传入参数

问题现象:

最近在研究如何使用 fegin调用第三方服务接口,并设置请求头和参数,发现了方法注解@Header 、 参数属性@RequestHeader 和 方法注解@Requestmapping 属性 headers 的特点,以及参数属性@RequestParam 、参数属性@Param 和 方法注解@Requestmapping 属性 params 的特点。


问题分析:

来观察一个我在项目中成功调用fegin接口的例子,这是fegin接口中定义的一个接口方法getToken

application.properties:

test-url=第三方服务接口ip地址和端口号

TestFegin :

@FeignClient(name = "test", url = "${test-url}")
@Component
public interface TestFegin {
	//获取用户的token
	@PostMapping(value = "/auth/oauth/token",
				headers = {"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"})
	JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
	                    @RequestParam(value = "grant_type", defaultValue = "password") String grantType,
	                    @RequestParam("username") String username,
	                    @RequestParam("password") String password);
}

TestController :

@CrossOrigin
@RestController
public class TestController {

    @Autowired TestFegin testFegin;

	/**
	 * 获取token
	 *
	 * @return
	 */
	@PostMapping("/getToken")
	public JSONObject getToken(@RequestBody JSONObject jsonObject) {
		JSONObject response = new JSONObject();
		if ( isLogin ) {
			response.put("status", "fail");
			response.put("msg", "登录失败!");
		}
		String tenantId = jsonObject.getString("tenantId");
		String username = jsonObject.getString("username");
		String password = jsonObject.getString("password");
    JSONObject tokenInfo = testFegin.getToken(tenantId, "password", username, password);
		response.put("msg", "成功");
		response.put("code", 200);
		response.put("data", tokenInfo);
	    return response;
    }
}

测试结果:

从这个例子中可以得知一些知识:

1.@Requestmapping(包括GetMapping/PostMapping)的 headers 属性中,可以设置请求头:

优点:这种方式可以自动给接口设置默认的请求头信息,因此在调用需要传入请求头信息,而这些请求头信息又是固定不变的接口的时候,就可以用这种方式。

 

2.@RequestHeader ,用于手动传入请求头信息。

特点:可以手动给fegin接口传入自定义的请求头信息。

 

3.方法注解@Header 和 @Requestmapping(包括GetMapping/PostMapping)的 headers 属性 ,据说用法和作用几乎是一样的,所以我测试了一下,发现是不行的,由此可见,传闻是假的,估计也是有什么弊端,

因为方法注解@Header 已经被弃用了,现在基本不用这种方式了,所以也不建议大家使用该注解,有兴趣的同伴,可以去详细了解一下:

	//获取用户的token
	@Headers({"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"})
	@PostMapping(value = "/blade-auth/oauth/token")
	JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
	                    @RequestParam(value = "grant_type", defaultValue = "password") String grantType,
	                    @RequestParam("username") String username,
	                    @RequestParam("password") String password);

 

4.@RequestParam:用于给接口传入参数,该参数会根据请求头content-type的属性值,确定参数的存在形式,例如例子中是以表单数据(application/x-www-form-urlencoded存在,而默认情况下则是以地址栏可见形式存在,defaultValue属性,据说可以设置默认值 如:

http://ip:端口?参数1=值1&参数2=值2......

如果想用 restful风格 的存在形式,则会用到 @PathVariable。

 

5.@Requestmapping 属性 params :用于限制接口的参数列表,只有满足条件的时候才能成功调用接口,否则会拦截,使接口调用失败,测试发现似乎没什么优点。

	//获取用户的token
	@PostMapping(value = "/blade-auth/oauth/token",
				headers = {"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"},
				params = {"grant_type=password"})
	JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
	                    @RequestParam(value = "grant_type", defaultValue = "password") String grantType,
	                    @RequestParam("username") String username,
	                    @RequestParam("password") String password);

缺点:不能像 headers属性 那样自动设置默认的参数值,参数值依旧是需要手动传入。

 

6.@Param,这个注解常用于dao/mapper层,作为参数注解。

特点:可以在调用方法时,打乱传入参数的顺序,而不需要按照方法定义的参数列表顺序来传参常注解在dao层中具有多个参数的抽象方法的参数上。

dao层:

    List<JSONObject> getInfoJson(@Param("tableName") String tableName, @Param("columns") String columns, @Param("where") String where);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值