前言
有些封装好的API把错误都屏蔽掉,直接返回某一个不明确的具体错误,让人感到困惑。
//code in SDK read-only
public static Data requestHandler(result) throws ApiException{
try{
resultEntity = JSONObject.parseObject(result);
}catch (Exception e){
throw new ApiException(SysEnums.SYS_ERR);
}
if(resultEntity == null || resultEntity .get("data") == null){
throw new ApiException(SysEnums.SYS_ERR);
}
}
public static Data someAPI(methodName,params) ApiException{
return requestHandler(getURLPATH(methodName),params);
}
//Implements
try{
result = someAPI(apiName,params);
}catch(ApiException e){
//You will get no detailed error message but only the error code SysEnums.SYS_ERR
}
闲的没事抓个包看看什么原因
parseObject 如果传递的参数不是JSON字符串,那么很有可能该接口返回了一个XML/HTML
就要看看这个究竟是什么。
好处:
1. 分析是调用方的错误,还是API提供方的错误
2. 错误具体原因如果是API提供方的,可以把返回信息反馈给API提供方,并且放心地进行重试。
3. 错误具体原因如果是API调用方的,可以帮助诊断程序错误。
抓包方法
下载Wireshark并安装
如图1-1所示:
图 1-1 使用过滤器
点击过滤器表达式右侧的 +
然后就可以将过滤器表达式保存下来。
还可以点击左侧 过滤器表达式首选项
可以添加多个过滤器。
例如可以抓目标主机为 blog.csdn.net
http.host contains "blog.csdn.net"
抓到的包如下图1-2所示:
图 1-2 抓包分析
这样选择任意一个HTTP请求,追踪流->HTTP流,然后就可以看该HTTP请求下的每次TCP的请求过程。可以清楚的看到返回的数据,如图1-3所示。
图 1-3 追踪HTTP流
wireshark实用的过滤器表达式
#抓HTTP的请求
tcp.port == 80 || udp.port == 80
#抓某出站请求路径
http.host == "domain.com" and http.request.uri contains "/url/path"
#只抓请求返回
ip.src_host contains "realdomain.com" and http
第一个表达式抓到的HTTP请求非常多,没什么用处
第二个表达式可以抓到本地发送的HTTP请求,并且只关注某个path
第三个表达式可以抓到某API返回的给本机的信息,并且是HTTP层的
注: “realdomain.com”是第二个表达式追踪流查到的目标主机真实的域名
以上。