my_api_client 0.13.0 → 0.16.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +102 -36
- data/.dependabot/config.yml +34 -0
- data/.envrc.skeleton +1 -0
- data/.rubocop.yml +8 -10
- data/.rubocop_challenge.yml +3 -0
- data/.rubocop_todo.yml +5 -10
- data/CHANGELOG.md +229 -0
- data/Gemfile.lock +48 -43
- data/README.jp.md +98 -23
- data/bin/console +4 -0
- data/example/api_clients/application_api_client.rb +13 -0
- data/example/api_clients/my_error_api_client.rb +34 -0
- data/example/api_clients/my_errors.rb +27 -0
- data/example/api_clients/my_pagination_api_client.rb +18 -0
- data/example/api_clients/my_rest_api_client.rb +48 -0
- data/example/api_clients/my_status_api_client.rb +22 -0
- data/lib/generators/rails/templates/application_api_client.rb.erb +0 -11
- data/lib/my_api_client.rb +10 -2
- data/lib/my_api_client/base.rb +2 -18
- data/lib/my_api_client/config.rb +0 -29
- data/lib/my_api_client/default_error_handlers.rb +64 -0
- data/lib/my_api_client/error_handling.rb +13 -23
- data/lib/my_api_client/error_handling/generator.rb +30 -10
- data/lib/my_api_client/error_handling/{process_retry_option.rb → retry_option_processor.rb} +1 -1
- data/lib/my_api_client/errors.rb +0 -53
- data/lib/my_api_client/errors/api_limit_error.rb +6 -0
- data/lib/my_api_client/errors/client_error.rb +93 -0
- data/lib/my_api_client/errors/network_error.rb +43 -0
- data/lib/my_api_client/errors/server_error.rb +42 -0
- data/lib/my_api_client/params/request.rb +7 -10
- data/lib/my_api_client/request.rb +48 -70
- data/lib/my_api_client/request/basic.rb +32 -0
- data/lib/my_api_client/request/executor.rb +89 -0
- data/lib/my_api_client/request/logger.rb +37 -0
- data/lib/my_api_client/request/pagination.rb +39 -0
- data/lib/my_api_client/rspec/matcher_helper.rb +2 -2
- data/lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb +2 -0
- data/lib/my_api_client/rspec/matchers/request_to.rb +3 -4
- data/lib/my_api_client/version.rb +1 -1
- data/my_api/.envrc.skeleton +3 -0
- data/my_api/.gitignore +14 -0
- data/my_api/.jetskeep +1 -0
- data/my_api/.rspec +3 -0
- data/my_api/.ruby-version +1 -0
- data/my_api/Gemfile +23 -0
- data/my_api/Gemfile.lock +243 -0
- data/my_api/Procfile +7 -0
- data/my_api/README.md +54 -0
- data/my_api/Rakefile +4 -0
- data/my_api/app/controllers/application_controller.rb +5 -0
- data/my_api/app/controllers/error_controller.rb +21 -0
- data/my_api/app/controllers/pagination_controller.rb +58 -0
- data/my_api/app/controllers/rest_controller.rb +60 -0
- data/my_api/app/controllers/status_controller.rb +11 -0
- data/my_api/app/helpers/application_helper.rb +5 -0
- data/my_api/app/jobs/application_job.rb +7 -0
- data/my_api/app/models/application_item.rb +5 -0
- data/my_api/config.ru +7 -0
- data/my_api/config/application.rb +73 -0
- data/my_api/config/dynamodb.yml +22 -0
- data/my_api/config/environments/development.rb +9 -0
- data/my_api/config/environments/production.rb +11 -0
- data/my_api/config/environments/test.rb +9 -0
- data/my_api/config/routes.rb +17 -0
- data/my_api/db/.gitkeep +0 -0
- data/my_api/public/404.html +67 -0
- data/my_api/public/422.html +67 -0
- data/my_api/public/500.html +66 -0
- data/my_api/public/favicon.ico +0 -0
- data/my_api/public/index.html +91 -0
- data/my_api/spec/controllers/error_controller_spec.rb +43 -0
- data/my_api/spec/controllers/pagination_controller_spec.rb +73 -0
- data/my_api/spec/controllers/rest_controller_spec.rb +99 -0
- data/my_api/spec/controllers/status_controller_spec.rb +47 -0
- data/my_api/spec/fixtures/payloads/posts-index.json +51 -0
- data/my_api/spec/fixtures/payloads/posts-show.json +53 -0
- data/my_api/spec/spec_helper.rb +31 -0
- data/my_api_client.gemspec +1 -1
- metadata +62 -9
- data/lib/my_api_client/logger.rb +0 -36
- data/renovate.json +0 -5
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
my_api_client (0.
|
4
|
+
my_api_client (0.16.1)
|
5
5
|
activesupport (>= 4.2.0)
|
6
6
|
faraday (>= 0.17.1)
|
7
7
|
jsonpath
|
@@ -10,75 +10,80 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (5.2.4.
|
13
|
+
activesupport (5.2.4.3)
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
15
|
i18n (>= 0.7, < 2)
|
16
16
|
minitest (~> 5.1)
|
17
17
|
tzinfo (~> 1.1)
|
18
18
|
addressable (2.7.0)
|
19
19
|
public_suffix (>= 2.0.2, < 5.0)
|
20
|
-
ast (2.4.
|
21
|
-
bugsnag (6.
|
20
|
+
ast (2.4.1)
|
21
|
+
bugsnag (6.16.0)
|
22
22
|
concurrent-ruby (~> 1.0)
|
23
|
-
byebug (11.1.
|
24
|
-
coderay (1.1.
|
25
|
-
concurrent-ruby (1.1.
|
23
|
+
byebug (11.1.3)
|
24
|
+
coderay (1.1.3)
|
25
|
+
concurrent-ruby (1.1.7)
|
26
26
|
crack (0.4.3)
|
27
27
|
safe_yaml (~> 1.0.0)
|
28
|
-
diff-lcs (1.
|
28
|
+
diff-lcs (1.4.4)
|
29
29
|
docile (1.3.2)
|
30
|
-
faraday (1.0.
|
30
|
+
faraday (1.0.1)
|
31
31
|
multipart-post (>= 1.2, < 3)
|
32
|
-
hashdiff (1.0.
|
33
|
-
i18n (1.8.
|
32
|
+
hashdiff (1.0.1)
|
33
|
+
i18n (1.8.5)
|
34
34
|
concurrent-ruby (~> 1.0)
|
35
|
-
|
36
|
-
json (2.3.0)
|
35
|
+
json (2.3.1)
|
37
36
|
jsonpath (1.0.5)
|
38
37
|
multi_json
|
39
38
|
to_regexp (~> 0.2.1)
|
40
|
-
method_source (0.
|
41
|
-
minitest (5.14.
|
42
|
-
multi_json (1.
|
39
|
+
method_source (1.0.0)
|
40
|
+
minitest (5.14.1)
|
41
|
+
multi_json (1.15.0)
|
43
42
|
multipart-post (2.1.1)
|
44
|
-
parallel (1.19.
|
45
|
-
parser (2.7.
|
46
|
-
ast (~> 2.4.
|
47
|
-
pry (0.
|
48
|
-
coderay (~> 1.1
|
49
|
-
method_source (~>
|
50
|
-
pry-byebug (3.
|
43
|
+
parallel (1.19.2)
|
44
|
+
parser (2.7.1.4)
|
45
|
+
ast (~> 2.4.1)
|
46
|
+
pry (0.13.1)
|
47
|
+
coderay (~> 1.1)
|
48
|
+
method_source (~> 1.0)
|
49
|
+
pry-byebug (3.9.0)
|
51
50
|
byebug (~> 11.0)
|
52
|
-
pry (~> 0.
|
53
|
-
public_suffix (4.0.
|
51
|
+
pry (~> 0.13.0)
|
52
|
+
public_suffix (4.0.5)
|
54
53
|
rainbow (3.0.0)
|
55
54
|
rake (13.0.1)
|
55
|
+
regexp_parser (1.7.1)
|
56
|
+
rexml (3.2.4)
|
56
57
|
rspec (3.9.0)
|
57
58
|
rspec-core (~> 3.9.0)
|
58
59
|
rspec-expectations (~> 3.9.0)
|
59
60
|
rspec-mocks (~> 3.9.0)
|
60
|
-
rspec-core (3.9.
|
61
|
-
rspec-support (~> 3.9.
|
62
|
-
rspec-expectations (3.9.
|
61
|
+
rspec-core (3.9.2)
|
62
|
+
rspec-support (~> 3.9.3)
|
63
|
+
rspec-expectations (3.9.2)
|
63
64
|
diff-lcs (>= 1.2.0, < 2.0)
|
64
65
|
rspec-support (~> 3.9.0)
|
65
66
|
rspec-mocks (3.9.1)
|
66
67
|
diff-lcs (>= 1.2.0, < 2.0)
|
67
68
|
rspec-support (~> 3.9.0)
|
68
|
-
rspec-support (3.9.
|
69
|
+
rspec-support (3.9.3)
|
69
70
|
rspec_junit_formatter (0.4.1)
|
70
71
|
rspec-core (>= 2, < 4, != 2.12.0)
|
71
|
-
rubocop (0.
|
72
|
-
jaro_winkler (~> 1.5.1)
|
72
|
+
rubocop (0.89.1)
|
73
73
|
parallel (~> 1.10)
|
74
|
-
parser (>= 2.7.
|
74
|
+
parser (>= 2.7.1.1)
|
75
75
|
rainbow (>= 2.2.2, < 4.0)
|
76
|
+
regexp_parser (>= 1.7)
|
77
|
+
rexml
|
78
|
+
rubocop-ast (>= 0.3.0, < 1.0)
|
76
79
|
ruby-progressbar (~> 1.7)
|
77
|
-
unicode-display_width (>= 1.4.0, <
|
78
|
-
rubocop-
|
79
|
-
|
80
|
-
rubocop-
|
81
|
-
rubocop (>= 0.
|
80
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
81
|
+
rubocop-ast (0.3.0)
|
82
|
+
parser (>= 2.7.1.4)
|
83
|
+
rubocop-performance (1.7.1)
|
84
|
+
rubocop (>= 0.82.0)
|
85
|
+
rubocop-rspec (1.43.2)
|
86
|
+
rubocop (~> 0.87)
|
82
87
|
ruby-progressbar (1.10.1)
|
83
88
|
safe_yaml (1.0.5)
|
84
89
|
sawyer (0.8.2)
|
@@ -91,14 +96,14 @@ GEM
|
|
91
96
|
simplecov-html (0.10.2)
|
92
97
|
thread_safe (0.3.6)
|
93
98
|
to_regexp (0.2.1)
|
94
|
-
tzinfo (1.2.
|
99
|
+
tzinfo (1.2.7)
|
95
100
|
thread_safe (~> 0.1)
|
96
|
-
unicode-display_width (1.
|
97
|
-
webmock (3.8.
|
101
|
+
unicode-display_width (1.7.0)
|
102
|
+
webmock (3.8.3)
|
98
103
|
addressable (>= 2.3.6)
|
99
104
|
crack (>= 0.3.2)
|
100
105
|
hashdiff (>= 0.4.0, < 2.0.0)
|
101
|
-
yard (0.9.
|
106
|
+
yard (0.9.25)
|
102
107
|
|
103
108
|
PLATFORMS
|
104
109
|
ruby
|
@@ -115,9 +120,9 @@ DEPENDENCIES
|
|
115
120
|
rubocop
|
116
121
|
rubocop-performance
|
117
122
|
rubocop-rspec
|
118
|
-
simplecov
|
123
|
+
simplecov (= 0.17.1)
|
119
124
|
webmock
|
120
125
|
yard
|
121
126
|
|
122
127
|
BUNDLED WITH
|
123
|
-
2.1.
|
128
|
+
2.1.4
|
data/README.jp.md
CHANGED
@@ -6,7 +6,9 @@ MyApiClient は API リクエストクラスを作成するための汎用的な
|
|
6
6
|
|
7
7
|
ただし、 Sawyer はダミーデータの作成が難しかったり、他の gem で競合することがよくあるので、将来的には依存しないように変更していくかもしれません。
|
8
8
|
|
9
|
-
また、 Ruby on Rails
|
9
|
+
また、 Ruby on Rails で利用することを想定してますが、それ以外の環境でも動作するように作っています。不具合などあれば Issue ページからご報告下さい。
|
10
|
+
|
11
|
+
[toc]
|
10
12
|
|
11
13
|
## Supported Versions
|
12
14
|
|
@@ -83,32 +85,95 @@ api_clinet.get_users #=> #<Sawyer::Response>
|
|
83
85
|
|
84
86
|
続いて、 `#get_users` や `#post_user` を定義します。メソッド名には API のタイトルを付けると良いと思います。メソッド内部で `#get` や `#post` を呼び出していますが、これがリクエスト時の HTTP Method になります。他にも `#patch` `#put` `#delete` が利用可能です。
|
85
87
|
|
88
|
+
### Pagination
|
89
|
+
|
90
|
+
API の中にはレスポンスに結果の続きを取得するための URL を含んでいるものがあります。
|
91
|
+
|
92
|
+
MyApiClient では、このような API を enumerable に扱うための `#pageable_get` というメソッドを用意しています。以下に例を示します。
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
class MyPaginationApiClient < ApplicationApiClient
|
96
|
+
endpoint 'https://example.com/v1'
|
97
|
+
|
98
|
+
# GET pagination?page=1
|
99
|
+
def pagination
|
100
|
+
pageable_get 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def headers
|
106
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
```
|
110
|
+
|
111
|
+
上記の例の場合、最初に `GET https://example.com/v1/pagination?page=1` に対してリクエストが実行され、続けてレスポンス JSON の `$.link.next` に含まれる URL に対して enumerable にリクエストを実行します。
|
112
|
+
|
113
|
+
例えば以下のようなレスポンスであれば、`$.link.next` は `"https://example.com/pagination?page=3"` を示します。
|
114
|
+
|
115
|
+
```json
|
116
|
+
{
|
117
|
+
"links": {
|
118
|
+
"next": "https://example.com/pagination?page=3",
|
119
|
+
"previous": "https://example.com/pagination?page=1",
|
120
|
+
},
|
121
|
+
"page": 2
|
122
|
+
}
|
123
|
+
```
|
124
|
+
|
125
|
+
そして `#pageable_get` は [Enumerator::Lazy](https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aLazy.html) を返すので、 `#each` や `#next` を実行することで次の結果を取得できます。
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
api_clinet = MyPaginationApiClient.new
|
129
|
+
api_clinet.pagination.each do |response|
|
130
|
+
# Do something.
|
131
|
+
end
|
132
|
+
|
133
|
+
p = api_clinet.pagination
|
134
|
+
p.next # => 1st page result
|
135
|
+
p.next # => 2nd page result
|
136
|
+
p.next # => 3rd page result
|
137
|
+
```
|
138
|
+
|
139
|
+
なお、`#each` はレスポンスに含まれる `paging` の値が nil になるまで繰り返されるのでご注意ください。例えば `#take` と組み合わせることでページネーションの上限を設定できます。
|
140
|
+
|
141
|
+
`#pageable_get` の alias として `#pget` も利用可能です。
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
# GET pagination?page=1
|
145
|
+
def pagination
|
146
|
+
pget 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
86
150
|
### Error handling
|
87
151
|
|
88
|
-
|
152
|
+
`my_api_client` ではレスポンスの内容によって例外を発生させるエラーハンドリングを定義できます。ここでは例として前述のコードにエラーハンドリングを定義しています。
|
89
153
|
|
90
154
|
```ruby
|
91
155
|
class ExampleApiClient < MyApiClient::Base
|
92
156
|
endpoint 'https://example.com'
|
93
157
|
|
94
|
-
error_handling status_code: 400..499,
|
158
|
+
error_handling status_code: 400..499,
|
159
|
+
raise: MyApiClient::ClientError
|
95
160
|
|
96
|
-
error_handling status_code: 500..599 do |
|
161
|
+
error_handling status_code: 500..599, raise: MyApiClient::ServerError do |_params, logger|
|
97
162
|
logger.warn 'Server error occurred.'
|
98
|
-
raise MyApiClient::ServerError, params
|
99
163
|
end
|
100
164
|
|
101
|
-
error_handling json: { '$.errors.code': 10..19 },
|
165
|
+
error_handling json: { '$.errors.code': 10..19 },
|
166
|
+
raise: MyApiClient::ClientError,
|
167
|
+
with: :my_error_handling
|
102
168
|
|
103
169
|
# Omission...
|
104
170
|
|
105
171
|
private
|
106
172
|
|
107
|
-
# @param params [MyApiClient::Params::Params] HTTP
|
108
|
-
# @param logger [MyApiClient::Logger] Logger for a request processing
|
173
|
+
# @param params [MyApiClient::Params::Params] HTTP reqest and response params
|
174
|
+
# @param logger [MyApiClient::Request::Logger] Logger for a request processing
|
109
175
|
def my_error_handling(params, logger)
|
110
176
|
logger.warn "Response Body: #{params.response.body.inspect}"
|
111
|
-
raise MyApiClient::ClientError, params
|
112
177
|
end
|
113
178
|
end
|
114
179
|
```
|
@@ -121,29 +186,26 @@ error_handling status_code: 400..499, raise: MyApiClient::ClientError
|
|
121
186
|
|
122
187
|
これは `ExampleApiClient` からのリクエスト全てにおいて、レスポンスのステータスコードが `400..499` であった場合に `MyApiClient::ClientError` が例外として発生するようになります。 `ExampleApiClient` を継承したクラスにもエラーハンドリングは適用されます。ステータスコードのエラーハンドリングは親クラスで定義すると良いと思います。
|
123
188
|
|
124
|
-
なお、 `status_code` には `Integer` `Range` `Regexp`
|
189
|
+
なお、 `status_code` には `Integer` `Range` `Regexp` が指定可能です。
|
190
|
+
|
191
|
+
`raise` には `MyApiClient::Error` を継承したクラスが指定可能です。`my_api_client` で標準で定義しているエラークラスについては以下のソースコードをご確認下さい。 `raise` を省略した場合は `MyApiClient::Error` を発生するようになります。
|
125
192
|
|
126
|
-
https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/errors
|
193
|
+
https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/errors
|
127
194
|
|
128
|
-
次に、 `
|
195
|
+
次に、 `block` を指定する場合について。
|
129
196
|
|
130
197
|
```ruby
|
131
|
-
error_handling status_code: 500..599 do |
|
198
|
+
error_handling status_code: 500..599, raise: MyApiClient::ServerError do |_params, logger|
|
132
199
|
logger.warn 'Server error occurred.'
|
133
|
-
raise MyApiClient::ServerError, params
|
134
200
|
end
|
135
201
|
```
|
136
202
|
|
137
|
-
上記の例であれば、ステータスコードが `500..599` の場合に `block` の内容が実行れます。引数の `params` にはリクエスト情報とレスポンス情報が含まれています。`logger` はログ出力用インスタンスですが、このインスタンスを使ってログ出力すると、以下のようにリクエスト情報がログ出力に含まれるようになり、デバッグの際に便利です。
|
203
|
+
上記の例であれば、ステータスコードが `500..599` の場合に `MyApiClient::ServerError` を発生させる前に `block` の内容が実行れます。引数の `params` にはリクエスト情報とレスポンス情報が含まれています。`logger` はログ出力用インスタンスですが、このインスタンスを使ってログ出力すると、以下のようにリクエスト情報がログ出力に含まれるようになり、デバッグの際に便利です。
|
138
204
|
|
139
205
|
```text
|
140
206
|
API request `GET https://example.com/path/to/resouce`: "Server error occurred."
|
141
207
|
```
|
142
208
|
|
143
|
-
リクエストに失敗した場合は例外処理を実行する、という設計が一般的だと思われるので、基本的にブロックの最後に `raise` を実行する事になると思います。
|
144
|
-
|
145
|
-
最後に `json` と `with` を利用する場合について。
|
146
|
-
|
147
209
|
```ruby
|
148
210
|
error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
|
149
211
|
```
|
@@ -159,17 +221,28 @@ error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
|
|
159
221
|
}
|
160
222
|
```
|
161
223
|
|
162
|
-
`with`
|
224
|
+
`with` にはインスタンスメソッド名を指定することで、エラーを検出した際、例外を発生させる前に任意のメソッドを実行させることができます。メソッドに渡される引数は `block` 定義の場合と同じく `params` と `logger` です。なお、 `block` と `with` は同時には利用できません。
|
163
225
|
|
164
226
|
```ruby
|
165
227
|
# @param params [MyApiClient::Params::Params] HTTP req and res params
|
166
|
-
# @param logger [MyApiClient::Logger] Logger for a request processing
|
228
|
+
# @param logger [MyApiClient::Request::Logger] Logger for a request processing
|
167
229
|
def my_error_handling(params, logger)
|
168
230
|
logger.warn "Response Body: #{params.response.body.inspect}"
|
169
|
-
raise MyApiClient::ClientError, params
|
170
231
|
end
|
171
232
|
```
|
172
233
|
|
234
|
+
#### Default error handling
|
235
|
+
|
236
|
+
`my_api_client` では、標準でステータスコード 400 ~ 500 番台のレスポンスを例外として処理するようにしています。ステータスコードが 400 番台場合は `MyApiClient::ClientError`、 500 番台の場合は `MyApiClient::ServerError` を継承した例外クラスが raise されます。
|
237
|
+
|
238
|
+
また、 `MyApiClient::NetworkError` に対しても標準で `retry_on` が定義されています。
|
239
|
+
|
240
|
+
いずれも override 可能ですので、必要に応じて `error_handling` を定義して下さい。
|
241
|
+
|
242
|
+
以下のファイルで定義しています。
|
243
|
+
|
244
|
+
https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/default_error_handlers.rb
|
245
|
+
|
173
246
|
#### Symbol を利用する
|
174
247
|
|
175
248
|
```ruby
|
@@ -238,7 +311,9 @@ end
|
|
238
311
|
|
239
312
|
API リクエストを何度も実行していると回線の不調などによりネットワークエラーが発生する事があります。長時間ネットワークが使えなくなるケースもありますが、瞬間的なエラーであるケースも多々あります。 `MyApiClient` ではネットワーク系の例外はまとめて `MyApiClient::NetworkError` として `raise` されます。この例外の詳細は後述しますが、 `retry_on` を利用する事で、 `ActiveJob` のように任意の例外処理を補足して、一定回数、一定の期間を空けて API リクエストをリトライさせる事ができます。
|
240
313
|
|
241
|
-
|
314
|
+
なお、 `retry_on MyApiClient::NetworkError` は標準実装されているため、特別に定義せずとも自動的に適用されます。 `wait` や `attempts` に任意の値を設定したい場合のみ定義してご利用ください。
|
315
|
+
|
316
|
+
ただし、 `ActiveJob` とは異なり同期処理でリトライするため、ネットワークの瞬断に備えたリトライ以外ではあまり使う機会はないのではないかと思います。上記の例のように API Rate Limit に備えてリトライするケースもあるかと思いますが、こちらは `ActiveJob` で対応した方が良いかもしれません。
|
242
317
|
|
243
318
|
ちなみに一応 `discard_on` も実装していますが、作者自身が有効な用途を見出せていないので、詳細は割愛します。良い利用方法があれば教えてください。
|
244
319
|
|
data/bin/console
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
|
4
4
|
require 'bundler/setup'
|
5
5
|
require 'my_api_client'
|
6
|
+
require './example/api_clients/my_error_api_client'
|
7
|
+
require './example/api_clients/my_rest_api_client'
|
8
|
+
require './example/api_clients/my_pagination_api_client'
|
9
|
+
require './example/api_clients/my_status_api_client'
|
6
10
|
|
7
11
|
# You can add fixtures and/or initialization code here to make experimenting
|
8
12
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'my_errors'
|
4
|
+
|
5
|
+
# An usage example of the `my_api_client`.
|
6
|
+
class ApplicationApiClient < MyApiClient::Base
|
7
|
+
endpoint ENV['MY_API_ENDPOINT']
|
8
|
+
|
9
|
+
self.logger = ::Logger.new(nil)
|
10
|
+
|
11
|
+
http_open_timeout 5.seconds
|
12
|
+
http_read_timeout 5.seconds
|
13
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'application_api_client'
|
4
|
+
|
5
|
+
# An usage example of the `my_api_client`.
|
6
|
+
# See also: my_api/app/controllers/status_controller.rb
|
7
|
+
class MyErrorApiClient < ApplicationApiClient
|
8
|
+
error_handling json: { '$.error.message': /You requested error code/ },
|
9
|
+
raise: MyErrors::ErrorCodeOther
|
10
|
+
|
11
|
+
error_handling json: { '$.error.code': :zero? },
|
12
|
+
raise: MyErrors::ErrorCode00
|
13
|
+
|
14
|
+
error_handling json: { '$.error.code': 10 },
|
15
|
+
raise: MyErrors::ErrorCode10
|
16
|
+
|
17
|
+
error_handling json: { '$.error.code': 20..29 },
|
18
|
+
raise: MyErrors::ErrorCode2x
|
19
|
+
|
20
|
+
error_handling json: { '$.error.code': 30 },
|
21
|
+
status_code: 400,
|
22
|
+
raise: MyErrors::ErrorCode30
|
23
|
+
|
24
|
+
# GET error/:code
|
25
|
+
def get_error(code:)
|
26
|
+
get "error/#{code}", headers: headers
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def headers
|
32
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MyErrors
|
4
|
+
# 400 Bad Request
|
5
|
+
class BadRequest < MyApiClient::ClientError; end
|
6
|
+
|
7
|
+
# 401 Unauthorized
|
8
|
+
class Unauthorized < MyApiClient::ClientError; end
|
9
|
+
|
10
|
+
# 403 Forbidden
|
11
|
+
class Forbidden < MyApiClient::ClientError; end
|
12
|
+
|
13
|
+
# Error code: 0
|
14
|
+
class ErrorCode00 < MyApiClient::ClientError; end
|
15
|
+
|
16
|
+
# Error code: 10
|
17
|
+
class ErrorCode10 < MyApiClient::ClientError; end
|
18
|
+
|
19
|
+
# Error code: 20 to 29
|
20
|
+
class ErrorCode2x < MyApiClient::ClientError; end
|
21
|
+
|
22
|
+
# Error code: 30
|
23
|
+
class ErrorCode30 < MyApiClient::ClientError; end
|
24
|
+
|
25
|
+
# Error code: other
|
26
|
+
class ErrorCodeOther < MyApiClient::ClientError; end
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'application_api_client'
|
4
|
+
|
5
|
+
# An usage example of the `my_api_client`.
|
6
|
+
# See also: my_api/app/controllers/pagination_controller.rb
|
7
|
+
class MyPaginationApiClient < ApplicationApiClient
|
8
|
+
# GET pagination?page=1
|
9
|
+
def pagination
|
10
|
+
pget 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def headers
|
16
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
17
|
+
end
|
18
|
+
end
|