rest-clientでAPIクライアントを書くって記事を書いたんですが、プロキシサーバーの設定によっては正しく接続できないケースがあったのでクライアント自体をFaradayで書き換えることをやりました。

接続できないケースというのは、プロキシサーバーのパスワードに特殊な文字(僕の場合は^+$など)が入っている場合で、エラー内容は残してないですが文字列処理か何かでエラーとなった記憶があります。特殊文字がエスケープできないか、とか色々試したんですが、確かダメだった気が、、ちょっと曖昧です。

rest-client版

以下、rest-clientについて書いたときの記事から転載。

 1class ApiClient
 2  ENDPOINT = 'https://api.example.com/items.json'.freeze
 3
 4  class << self
 5    def items(search)
 6      url = ENDPOINT
 7      params = {s: search}
 8      get(url, params)
 9      return [] if data.nil?
10
11      data['items'].map do |item|
12        ItemResponse.new(item)
13      end
14    end
15
16    def item
17      # ...
18    end
19
20    private
21
22    def get(url, params)
23      res = RestClient.get(url, params: params)
24      return nil if res.code != 200
25
26      JSON.parse(res.body)
27    end
28  end
29end
30
31# こんな感じで使う
32ApiClient.items('けんさく') => [...]

Faraday版

 1class ApiClient
 2  # ENDPOINTはホストまでになる
 3  ENDPOINT = 'https://api.example.com/'.freeze
 4
 5  class << self
 6    def items(search)
 7      params = {s: search}
 8
 9      # ENDPOINTは固定なのでpath渡し変えておく
10      get('items.json', params)
11
12      # 以下同じ
13      return [] if data.nil?
14
15      data['items'].map do |item|
16        ItemResponse.new(item)
17      end
18    end
19
20    private
21
22    def get(path, params)
23      conn = Faraday.new(ENDPOINT,
24                     proxy: {
25                       uri: 'proxy_url'
26                       user: 'proxy_account',
27                       password: 'proxy_password^+$'
28                     })
29      res = conn.get(path, params)
30      return nil if res.status != 200
31      JSON.parse(res.body)
32    end
33  end
34end
35
36# 使い方は一緒
37ApiClient.items('けんさく') => [...]

Faraday版の場合はプロキシのアカウントを個別に指定できるので特殊文字が含まれていても問題がありませんでした。