質問編集履歴

1

質問時と状況が変わったので追記させていただきます。

2020/01/16 10:53

投稿

marutto
marutto

スコア32

test CHANGED
@@ -1 +1 @@
1
- [laravel]axiosで外部WebAPIに通信するとCORSエラーが出る
1
+ [laravel][guzzle]axiosでlaravel側のWebAPIの情報を取得するアクションを実行させたい
test CHANGED
@@ -2,7 +2,45 @@
2
2
 
3
3
 
4
4
 
5
- 相談したいのは、axiosを使って楽天書籍検索のWebAPIへGET通信した際CORSエラーに対するです。
5
+ 相談したいのは、axiosでlaravel側の楽天ブックAPIの情報を取得するアクションを実行させるです。
6
+
7
+
8
+
9
+ [【Laravel & Guzzle】APIの呼び出し方法をわかりやすく解説](https://yaba-blog.com/laravel-call-api/)
10
+
11
+ こちらの記事内にあります、「【GET編】コントローラに処理を記載して、viewで表示する」を参考に実装しています。
12
+
13
+
14
+
15
+ ・エラー内容
16
+
17
+ ```ここに言語を入力
18
+
19
+ app.js:665 Uncaught (in promise) Error: Request failed with status code 500
20
+
21
+ at createError (app.js:665)
22
+
23
+ at settle (app.js:911)
24
+
25
+ at XMLHttpRequest.handleLoad (app.js:178)
26
+
27
+ ```
28
+
29
+ 500エラーについてログを確認したところ、以下の記述がありました。
30
+
31
+ ```ここに言語を入力
32
+
33
+ [2020-01-16 19:39:49] production.ERROR: Object of class GuzzleHttp\Psr7\Response could not be converted to string {"userId":1,"exception":"[object] (ErrorException(code: 0): Object of class GuzzleHttp\Psr7\Response could not be converted to string at /home/engineer5271/op-book.tk/laravel/src/app/Http/Controllers/API/BookController.php:58)
34
+
35
+ [stacktrace]
36
+
37
+ #0 /home/ホスト/アプリドメイン/laravel/src/app/Http/Controllers/API/BookController.php(58): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(4096, 'Object of class...', '/home/ホスト...', 58, Array)
38
+
39
+ #1 [internal function]: App\Http\Controllers\API\BookController->show('\xE4\xBF\xAE\xE7\xBE\x85\xE3\x81\xAE\xE9\x96\x80')
40
+
41
+ ```
42
+
43
+
6
44
 
7
45
 
8
46
 
@@ -10,57 +48,23 @@
10
48
 
11
49
  ・やったこと
12
50
 
13
- inputから入力された値をURLパラメータに乗せてGET通信、受け取った情報をveux(store)で同期、コネントに出力
14
-
15
-
16
-
17
- 下記、laravelのプロジェクトを作成する前にオンラインエディター(codesandbox)のプロジェクトURLを登録したところ、本の情報を引っ張ってこれてました。
18
-
19
-
20
-
21
-
22
-
23
- ・コンソールで確認したエラー
24
-
25
- ```ここに言語を入力
26
-
27
- Access to XMLHttpRequest at 'https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?format=json&formatVersion=2&elements=title,author,itemPrice,itemCaption,isbn,salesDate,largeImageUrl,booksGenreId,affiliateUrl&sort=standard&title=%E4%BF%AE%E7%BE%85%E3%81%AE%E%80&hits=5&applicationId=xxxxxxxxxx&affiliateId=xxxxxxxxxxx' from origin 'https://アプリドメイン' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
28
-
29
- ```
30
-
31
-
32
-
33
- ```ここに言語を入力
34
-
35
- app.js:665 Uncaught (in promise) Error: Network Error
36
-
37
- at createError (app.js:665)
38
-
39
- at XMLHttpRequest.handleError (app.js:200)
40
-
41
- ```
42
-
43
-
44
-
45
- 続いて、vuex(store)のコードです。
46
-
47
- (フロントサイドにApplicationIdを載せることのリスクは承知しているのですが、一旦脇に置いてご覧になってくださると幸いです。)
48
-
49
- なお、パラメータ中に展開されているenv.APIKeyとaffiliate_Idはenv.jsという別ファイルから読み込んでいます。
50
-
51
- ・store/index.js
51
+ vueで作ったinputにテキストが入力されると、キーワードをURLパラメータに乗せてapiアクショのルートにGET
52
+
53
+ コントローラーアクションとしては「show」になります。
54
+
55
+
56
+
57
+ ・store/index.js内の該当メソッド
52
58
 
53
59
  ```ここに言語を入力
54
60
 
55
61
  async doSearch({ commit }, queryWord) {
56
62
 
57
- const limit = 5;
58
-
59
- const url = `https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?format=json&formatVersion=2&elements=title,author,itemPrice,itemCaption,isbn,salesDate,largeImageUrl,booksGenreId,affiliateUrl&sort=standard&title=${queryWord}&hits=${limit}&applicationId=${env.APIkey}&affiliateId=${env.affiliateId}`;
60
-
61
- // TODO:下のconsole.logで本番削除
62
-
63
- console.log(url);
63
+ // キーワードをリクエストパラメータで送る
64
+
65
+ const url = `/book/${queryWord}`;
66
+
67
+
64
68
 
65
69
  // TODO:例外処理
66
70
 
@@ -98,29 +102,169 @@
98
102
 
99
103
  }
100
104
 
101
- ```
102
-
103
-
104
-
105
- [楽天ブックスAPIについて](https://webservice.rakuten.co.jp/document/#bookApi)
106
-
107
- ![イメージ説明](f0089f573bfaf32c40a059db0fccb0ca.png)
108
-
109
-
110
-
111
- フロント・バック(ruby)の違いはありますが、下記の楽天ブックスの使い方書かれた記事みる限り、
112
-
113
- CORSについての処理はしていないのですが・・・。
114
-
115
-
116
-
117
- ・[楽天ブックス書籍検索APIでISBNコードから書籍情報を表示する](https://usortblog.com/rakuten-books-api-shortcode/)
118
-
119
-
120
-
121
- また、繰り返しなりますが、オンラインエディター上では情報取ってこれていたので、
122
-
123
- どうすればいいか悩んでおります。
105
+ }
106
+
107
+ });
108
+
109
+ ```
110
+
111
+
112
+
113
+ ・route/web.php内にapireourceルートを設置
114
+
115
+ ```ここ言語入力
116
+
117
+ Route::apiResource('/book', 'API\BookController');
118
+
119
+ ```
120
+
121
+
122
+
123
+ ・app\HttpディレクトリにAPI/BookControllerを作成
124
+
125
+ ```ここ言語入力
126
+
127
+ // 以下ターミナルコマンドを実行
128
+
129
+ php artisan make:controller API/BookController --api
130
+
131
+ ```
132
+
133
+
134
+
135
+ ・config/services.phpに環境変数(楽天ブックスのapplicationId)の記述を追加
136
+
137
+ ```ここに言語を入力
138
+
139
+ return [
140
+
141
+
142
+
143
+ 'sparkpost' => [
144
+
145
+ 'secret' => env('SPARKPOST_SECRET'),
146
+
147
+ ],
148
+
149
+ // 末尾に追加
150
+
151
+ 'rakuten' => [
152
+
153
+ 'api_key' => env("API_KEY"),
154
+
155
+ 'secret_key' => env("SECRET_KEY"),
156
+
157
+ 'affiliate_id' => env("AFFILIATE_ID")
158
+
159
+ ]
160
+
161
+ }
162
+
163
+ ```
164
+
165
+
166
+
167
+
168
+
169
+ ・コントローラー内に以下を記述
170
+
171
+ キーワード検索をしたいので、showアクションに記述
172
+
173
+ ```ここに言語を入力
174
+
175
+ <?php
176
+
177
+
178
+
179
+ namespace App\Http\Controllers\API;
180
+
181
+
182
+
183
+ use Illuminate\Http\Request;
184
+
185
+ use App\Http\Controllers\Controller;
186
+
187
+ use GuzzleHttp\Client;
188
+
189
+
190
+
191
+ class BookController extends Controller
192
+
193
+ {
194
+
195
+ /**
196
+
197
+ * Display the specified resource.
198
+
199
+ *
200
+
201
+ * @param int $id
202
+
203
+ * @return \Illuminate\Http\Response
204
+
205
+ */
206
+
207
+ public function show($id)
208
+
209
+ {
210
+
211
+ // GETで送られてきたキーワード
212
+
213
+ $key_word = $id;
214
+
215
+ // 取得件数
216
+
217
+ $limit = 10;
218
+
219
+ // アプリケーションID(config/services.php/rakuten/api.keyを読み込む)
220
+
221
+ $api_key = config('services.rakuten.api_key');
222
+
223
+ // 通信方法
224
+
225
+ $method = "GET";
226
+
227
+
228
+
229
+ // URL
230
+
231
+ $url = "https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404?format=json&formatVersion=2&elements=title,author,itemPrice,itemCaption,isbn,salesDate,largeImageUrl,booksGenreId,affiliateUrl&sort=standard&title={$key_word}&hits={$limit}&applicationId={$api_key}";
232
+
233
+
234
+
235
+ // リクエストインスタンス生成
236
+
237
+ $client = new Client();
238
+
239
+
240
+
241
+ // GETで楽天ブックスへ通信
242
+
243
+ $response = $client->request($method, $url);
244
+
245
+
246
+
247
+ return response()->json($response);
248
+
249
+ }
250
+
251
+ ```
252
+
253
+
254
+
255
+ ・php artisan route:list」で、ルートを確認
256
+
257
+ ![イメージ説明](1621444a5b9f6b6144ddeaf201b2c2bc.png)
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+ ここまでしたのですが、最初に挙げたエラーが解決できず詰まっています。
266
+
267
+
124
268
 
125
269
 
126
270