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

2022-08-09 09:07:28

问题现象:

最近在研究如何使用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);

  • 作者:Stephen·You
  • 原文链接:https://blog.csdn.net/weixin_42585386/article/details/112832774
    更新时间:2022-08-09 09:07:28