一次化简为繁的经历:用反射修改HTTP请求头
文章目录
写作业的时候,SpringBoot,要对某一用户调用某个api进行计数然后对他限流,用户的身份标识是在HTTP的请求头中的一个字段“ACCOUNT-ID”。--header 'ACCOUNT-ID: 1234567'
在自己测试的时候就需要想办法用这个请求头去测试限流的效果。没有找到什么好的办法于是就想了以下反射的办法来设置请求头。
--
解决过程
找到在哪set Header
在那个api之前定义一个拦截器,在其中修改请求头。
先可以输出一下request的具体实现类:
1Class<? extends HttpServletRequest> requestClass = request.getClass();
2System.out.println(requestClass);
输出结果是:
1class org.apache.catalina.connector.RequestFacade
1. org.apache.catalina.connector.RequestFacade
点进这个类,这个类有个字段request:
1protected Request request = null;
2.org.apache.catalina.connector.Request
再点进这个Request,它的getHeader方法如下:
1@Override
2public String getHeader(String name) {
3 return coyoteRequest.getHeader(name);
4}
其中coyoteRequest字段如下:
1protected org.apache.coyote.Request coyoteRequest;
再点进去。
3.org.apache.coyote.Request
它的getHeader方法如下:
1public String getHeader(String name) {
2 return headers.getHeader(name);
3}
其中headers字段:
1private final MimeHeaders headers = new MimeHeaders();
4. org.apache.tomcat.util.http.MimeHeaders
这个就是需要的类了,里面有addValue和setValue等方法。
一路反射过去修改即可
1Class<? extends HttpServletRequest> requestClass = request.getClass();
2Field field = requestClass.getDeclaredField("request");
3field.setAccessible(true);
4Object aRequest = field.get(request);
5
6Field coyoteField = aRequest.getClass().getDeclaredField("coyoteRequest");
7coyoteField.setAccessible(true);
8Object coyoteRequest = coyoteField.get(aRequest);
9
10Field headers = coyoteRequest.getClass().getDeclaredField("headers");
11headers.setAccessible(true);
12MimeHeaders mimeHeader = (MimeHeaders) headers.get(coyoteRequest);
13System.out.println(mimeHeader.getClass());
14mimeHeader.setValue("ACCOUNT-ID").setString("1234567");
然后就可以愉快地测试了。
总结
应该如何测试某个接口
我要的是测试某个接口,应该直接去找测试的工具的,然后就找到了postman这样子的工具,或者使用mockmvc来进行测试。而我只想着去改它的请求头,就把精力全部转向去解决如何去修改请求头了。
XY问题
这让我想到所谓的XY问题,即某人想解决问题X,他觉得Y是该问题的解法,他不会Y,于是就去问别人Y怎么做,最后经过大量讨论浪费大量时间后他们发现Y不是用来解决X的合适方法,于是他们就是在一个根本错误的方向上浪费了大量时间。
comments powered by Disqus