记录一个坑爹的BUG的解决过程,和启发。
事件背景:
需要调用一个Public API,但在本地一直调用失败!用
RestClient
发起HTTP,提示:RestClient::Forbidden: 403 Forbidden
。自此开启DEBUG之路。
现象一:
用浏览器和POSTMAN来调用API,调正常,返回200。但遇到RestClient就挂。
疑点与解决:
是否版本冲突?
找了8个同学的电脑测试,一样的Ruby/Rails/Openssl版本,有的可以有的不可以,否。
是否IP被限制?
如果IP被限制,那用浏览器和POSTMAN就应该也会遇错吧?否。
最后:
无意间用RestClient来get Google,才发现终端机一直没有走上代理,我是用shadowsocks来实现科学上网的。那API无法访问是否也是因为这个呢?用手机4G来测试,果然!
原因:
科学上网用的shadownsocks,用浏览器和postman发出的请求能通过shadowsocks科学上网,而用RestClient和curl发出的请求通常不走shadowsocks代理。
2种解决方法:
给rest-client添加代理:link
1RestClient.proxy = "http://proxy.example.com/"用mac端软件proxifier结合梯子工具,给电脑上所有端口都转发到梯子的代理端口。
回顾:
看到这里你会想这个bug也没有多难。但我是省略了很多中间的过程,比如,发微信群里救助,有朋友提示用curl来了解整个http请求的详细过程。于是用curl发现
openssl
版本的差异,再来发现UA的差异,Content-type
的差异。才发现这些东西以前从来没听过,需要一个一个去GOOGLE,最后这些坑填完后还是发现不行。那一开始为什么没有切换手机4G来试呢?因为确定了不是IP限制,电脑同样有科学上网,所以没有往手机4G去调试。
启发:
- 下次遇到这个情况:切换不同设备,不同网络来测试,不同IP来测试。
- 猜想:这个API通过类似google reptcha自动验证,如果你的网络转发过多或者太次,那么调用时会需要验证码验证!
- 终端机可以Google找方法来实现科学上网。可以参考这篇
- 最后:论一条好的光纤的重要性!
后记:
这个API地址是:https://poloniex.com/public?command=returnTicker
你可以用来测试下你的网络环境是否够nice,这样做:
直接在浏览器里打开,
够nice
:直接得到一串JSON数据。如果不够NIce
:会显示一个html页面,提示你需要验证。