素材巴巴 > 程序开发 >

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

程序开发 2023-09-11 22:58:06

问题现象:

最近在研究如何使用 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 getInfoJson(@Param("tableName") String tableName, @Param("columns") String columns, @Param("where") String where);
 

 


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。