質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

5261閲覧

Reactのfetch-jsonpでyahoo apiをたたくとcross-originエラーが発生する

kazu2021

総合スコア48

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

1グッド

1クリップ

投稿2021/10/15 02:12

編集2021/10/18 06:25

前提・実現したいこと

Reactの勉強中です。
yahoo apiをたたいて商品カテゴリーランキングを取得するWebアプリを作成しております。

fetch-jsonpでapiをたたいたところ下記のクロスオリジンエラーが発生しました

発生している問題・エラーメッセージ

**Cross-Origin Read Blocking (CORB) blocked cross-origin response **https://shopping.yahooapis.jp/ShoppingWebService/V2/categoryRanking?appid=XXXXXXXXXX&category_id=10002&callback=jsonp_1634193643100_26941 with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.

Error: JSONP request to https://shopping.yahooapis.jp/ShoppingWebService/V2/categoryRanking?appid=XXXXXXXXXX&category_id=10002 timed out

※上記APIをクロームブラウザで表示するとカテゴリーランキングのjsonデータが返ってきます。

該当のソースコード

import fetchJsonp from 'fetch-jsonp';
import qs from 'qs';
import { replace } from 'react-router-redux';

const API_URL = 'https://shopping.yahooapis.jp/ShoppingWebService/V2/categoryRanking';
// const API_URL = 'https://shopping.yahooapis.jp/ShoppingWebService/V1/json/categoryRanking';
const APP_ID = 'XXXXXXXXX';

//リクエスト開始
const startRequest = category => ({
type: 'START_REQUEST',
payload: { category },
});

//レスポンス受信
const receiveData = (category, error, response) => ({
type: 'RECEIVE_DATA',
payload: { category, error, response },
});

//リクエスト完了
const finishRequest = category => ({
type: 'FINISH_REQUEST',
payload: { category },
});

//ランキングを取得する
export const fetchRanking = categoryId => {
//redux-thunkを使った非同期処理
return async (dispatch, getState) => {
//カテゴリIDに対応するstate.shopping.categoriesの要素を取得
const categories = getState().shopping.categories;
const category = categories.find(category => (category.id === categoryId));
//対応するデータがない場合はトップページへリダイレクト
if (typeof category === 'undefined') {
dispatch(replace('/'));
return;
}

dispatch(startRequest(category)); const queryString = qs.stringify({ appid: APP_ID, category_id: categoryId, }); try { // const responce = await fetchJsonp(`${API_URL}?${queryString}`);

** const responce = await fetchJsonp(${API_URL}?${queryString});**
const data = await responce.json();
dispatch(receiveData(category, null, data));
} catch (err) {
dispatch(receiveData(category, err));
}
dispatch(finishRequest(category));

};
};

試したこと

chromeブラウザの拡張機能で「Access Control Allow Origin」をインストールして
クロスオリジンでもアクセスできるようにしましたが問題は解決しませんでした。

補足情報(FW/ツールのバージョンなど)

テスト環境URL
http://localhost:3000/

以上、ご査収の程よろしくお願い申し上げます。

追記 fetch-jsonpをfetchに変更
// const responce = await fetchJsonp(${API_URL}?${queryString});
const responce = await fetch(${API_URL}?${queryString});

fetchに変えてみたところ、下記エラーが表示されました。
「Failed to load resource: net::ERR_FAILED」
API自体をたたけていないようです。
エラー画面

どうしたらAPIのデータを取得できるのかご教示いただけたら幸いです。

10/18 追記
fetchのmodeをcors指定にして、クロームブラウザの拡張ライブラリ「Access-Control-Allow-Origin」をONして
yahoo APIにアクセスしたところ、responseでデータの取得はできました
ただし、strictモードでのエラーが発生しており画面にデータを表示できていない状態です。

yahoo api(V2)はjsonpには対応していないようですがcorsには対応していると思われます。
クロスサイトオリジンの制限はブラウザでの制限なのでjsonpが使えないため
chromeの拡張ライブラリで乗り越えました。

問題がcorsからstrictモードになったので別に質問させていただきます。
ご回答者様ありがとうございました。

コードの編集
// const responce = await fetchJsonp(${API_URL}?${queryString});
const responce = await fetch(${API_URL}?${queryString} ,{mode:'cors'});

responseデータ
イメージ説明
イメージ説明

Strictでのエラー
TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
at Function.r (<anonymous>:1:83)
at Object._callee$ (http://localhost:3000/static/js/bundle.js:55313:22)
at tryCatch (http://localhost:3000/static/js/bundle.js:1218:40)
at Generator.invoke [as _invoke] (http://localhost:3000/static/js/bundle.js:1452:22)
at Generator.prototype.<computed> [as next] (http://localhost:3000/static/js/bundle.js:1270:21)
at step (http://localhost:3000/static/js/bundle.js:55244:191)
at http://localhost:3000/static/js/bundle.js:55244:437
at new Promise (<anonymous>)
at http://localhost:3000/static/js/bundle.js:55244:99
at http://localhost:3000/static/js/bundle.js:55345:19
at http://localhost:3000/static/js/bundle.js:46615:18
at http://localhost:3000/static/js/bundle.js:46593:7806
at Object.onUpdate (http://localhost:3000/static/js/bundle.js:55671:7)
at Ranking.componentWillUpdate (http://localhost:3000/static/js/bundle.js:55478:20)
at updateClassInstance (http://localhost:3000/static/js/bundle.js:23570:18)
at updateClassComponent (http://localhost:3000/static/js/bundle.js:27457:20)
at beginWork (http://localhost:3000/static/js/bundle.js:28970:16)
at beginWork$1 (http://localhost:3000/static/js/bundle.js:33529:14)
at performUnitOfWork (http://localhost:3000/static/js/bundle.js:32504:12)
at workLoopSync (http://localhost:3000/static/js/bundle.js:32480:22)
at performSyncWorkOnRoot (http://localhost:3000/static/js/bundle.js:32106:9)
at http://localhost:3000/static/js/bundle.js:21439:24
at unstable_runWithPriority (http://localhost:3000/static/js/bundle.js:48446:12)
at runWithPriority$1 (http://localhost:3000/static/js/bundle.js:21389:10)
at flushSyncCallbackQueueImpl (http://localhost:3000/static/js/bundle.js:21434:7)
at flushSyncCallbackQueue (http://localhost:3000/static/js/bundle.js:21422:3)
at discreteUpdates$1 (http://localhost:3000/static/js/bundle.js:32243:7)
at discreteUpdates (http://localhost:3000/static/js/bundle.js:11156:12)
at dispatchDiscreteEvent (http://localhost:3000/static/js/bundle.js:14518:3)

mknkgwr👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2021/10/15 03:12

fetch で叩いてもCORSでブロックされるのは変わらなさそうな気がしますが……
kazu2021

2021/10/15 03:18

この方がPHPですがcorsエラーでずにV2でAPIの取得に成功してまして https://bubudoufu.com/query-ranking/#toc3 > $response = file_get_contents($url); なんて私の環境だけCORSでブロックされてしまうのかなと・・
Lhankor_Mhy

2021/10/15 03:20

PHPだからでは。 CORSブロックするのはサーバではなくてクライアントなので、サーバ間のアクセスではブロックされないです。
kazu2021

2021/10/15 03:29

クライアントで実行されれるjavascripでは jsonpに対応していないyahoo API(V2)からデータを取得することはできないということでしょうか?
Lhankor_Mhy

2021/10/15 03:44

そうなのではないかと思います。
kazu2021

2021/10/15 07:46

fetch apiでmode:corsを指定すると異なるオリジンの問題を乗り越えられるようなので 指定したところ 「Failed to load resource: net::ERR_FAILED」のエラーは出なくなりましたが modoを指定しない場合と同じapiのところでpauseします。(質問最後尾画像) // const responce = await fetchJsonp(`${API_URL}?${queryString}`); const responce = await fetch(`${API_URL}?${queryString}` ,{mode:'cors'}); もう少し調べてみます ありがとうございました。
kazu2021

2021/10/18 06:27

質問文に追記させて頂きました。 mode:corsでサーバ側からカテゴリーランキングのresponseのデータを取得できました。 strictモードでのエラーが発生しているため別スレッドで質問させていただきます。 たいへん助かりました。ありがとうございました。
Lhankor_Mhy

2021/10/18 06:56 編集

なるほど、ご自身のみで利用するアプリを作っていて、第三者に公開する予定ではなかったのですね。 ご解決されて何よりです。 お手数ですが、自己解決の処理をお願いします。
guest

回答2

0

自己解決

fetchのmodeをcors指定
クロームブラウザの拡張ライブラリ「Access-Control-Allow-Origin」をON
yahoo APIでresponseでデータの取得
responseデータをYahoo API(V2)用のオブジェクトツリーに合わせるようにコードを変更し
ランキングデータを画面表示できました

クロームブラウザの拡張ライブラリでCORSのブロックを強制的に解除してるため
テスト環境のみでの動作になります。

Lhankor_Mhy様
いろいろとご指摘いただき誠にありがとうございました。

データ取得成功

投稿2021/10/19 06:14

kazu2021

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそも、当該APIがJSONPに非対応のようです(Yahoo!公式)。

投稿2021/10/15 02:31

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問