背景
在第三方接口对接时,往往会出现如下问题。
- 接口提供方接口已经提供好,文档标准规范,但是调用方始终无法调用成功。
RestTemplate
也是从网上找来的代码,看这问题不大,参数死活传不对PostMan
调用可以,但是代码开始写了,老是传不对参数。- 客户端开发人员拿着各种客户端的代码给服务提供者看,并说:你看,我代码写的没问题。服务提供者:头大头大,开发语言都不一样,鬼知道咋回事。
在接口对接时,往往第一个接口会出现各种各样的问题,请求头、请求体、请求类型、签名等等。由于开发人员开发语言、开发习惯不同,导致双方对接失败,开发时,也不可能帮对方去检测代码。这时可以通过一些大家有公共认知的东西来进行比较,如:比较Http请求报文。
大部分开发人员会熟悉谷歌浏览器的F12调试工具,这个工具可以清晰的看到http请求报文。慢慢的,大家也熟悉了http请求报文,因此,可以通过对比这些大家公认的一下信息,来快速的比较、定位问题。
简单快速的抓取Http请求报文
1.1 fiddler工具
这是一个http代理工具,可以抓取经过此代理的所有http请求。如下图
1.2 java socket代码
众所周知,Http协议是基于Tcp协议的。因此,可以通过java代码实现一个socket服务,通过http请求来请求当前服务。
public static final Integer port = 8080;
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket accept = serverSocket.accept();
InputStreamReader reader = new InputStreamReader(accept.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
String str = null;
while ((str = bufferedReader.readLine())!=null){
System.out.println("----------");
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
如上代码,启动开之后,在浏览器输入http://localhost:8080/socket/test?userName=123。请求到本地的8080 端口,控制台即可打印如下信息。
GET/socket/test?userName=123HTTP/1.
Host:localhost:8080
Connection:keep-alive
Cache-Control:max-age=0
sec-ch-ua:“Chromium”;v=“104”,“NotA;Brand”;v=“99”,“GoogleChrome”;v=“104”
sec-ch-ua-mobile:?0
sec-ch-ua-platform:“Windows”
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/104.0.0.0Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site:none
Sec-Fetch-Mode:navigate
Sec-Fetch-User:?1
Sec-Fetch-Dest:document
Accept-Encoding:gzip,deflate,br
Accept-Language:zh-CN,zh;q=0.9
1.3 TCP工具
如果当前没有java开发环境,可通过tcp工具启动监听,来获取http请求报文。TCP工具下載
最后可以通过成功请求到接口的报文,和请求失败的报文进行对比,即可快速的定位问题。