RestClient::Forbidden:403记录一个解BUG过程

记录一个坑爹的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种解决方法:
  1. 给rest-client添加代理:link

    1
    RestClient.proxy = "http://proxy.example.com/"
  2. 用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页面,提示你需要验证。