一次化简为繁的经历:用反射修改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