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