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

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

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

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

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

Q&A

解決済

1回答

3627閲覧

YahooAPIの結果をJavaScriptから取得したいが、CORSによってブロックされてしまう

BraveDragon

総合スコア15

JavaScript

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

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

1グッド

1クリップ

投稿2021/06/29 09:40

前提・実現したいこと

現在地を取得して、最寄りのマクドナルドやガストなどを検索するアプリケーションを作成しています。
「Yahoo!ローカルサーチAPI」を利用して、その検索結果をJavaScriptから利用しようと思ったのですが、作成したWebアプリケーションを実行してコンソールを開くと、

Access to fetch at 'https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=(検索キーワード(URLエンコード済み))&dist=3&sort=geo&lon=(経度)&lat=(緯度)&output=json' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

というようなメッセージが表示されました。
恐らくCORS関連のエラーだとは思うのですが、解決方法が分かりません。
このエラーを解決し、JavaScriptから検索結果を利用できるようにしたいのですが、どうすればよろしいでしょうか?

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

  • 現在地を取得して、最寄りのマクドナルドやガストなどを検索するアプリケーションを開発中である。

「Yahoo!ローカルサーチAPI」を利用して、その検索結果をJavaScriptから利用しようと思ったのですが、作成したWebアプリケーションを実行してコンソールを開くと、

Access to fetch at 'https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=(検索キーワード(URLエンコード済み))&dist=3&sort=geo&lon=(経度)&lat=(緯度)&output=json' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

というようなメッセージが表示される。恐らくはCORS関連のエラーだとは思うが、解決方法が分からない。

  • このエラーを解決し、JavaScriptから検索結果を利用できるようにしたい。

該当のソースコード

javascript

1const app = new Vue({ 2 el: "#app", 3 data:{ 4 lon: NaN, 5 lat: NaN, 6 target: "", 7 }, 8 methods:{ 9 getLocation: function(){ 10 //検索対象が入力されていない場合は検索をしない 11 if(this.target===""){ 12 return; 13 } 14 navigator.geolocation.getCurrentPosition(this.getLocationImpl); 15 }, 16 getLocationImpl: function(position){ 17 this.lon = position.coords.longitude; 18 this.lat = position.coords.latitude; 19 createMap(); 20 } 21 }, 22 23}); 24 25function GETYahooRequest(keyword, lon, lat){ 26 const RequestURL = "https://map.yahooapis.jp/search/local/V1/localSearch?appid=(アプリケーションID)&query=" 27 +keyword+"&dist=3&sort=geo&lon="+String(lon)+"&lat="+String(lat)+"&output=json"; 28 fetch(RequestURL,{ 29 method: "GET", 30 mode: 'cors', 31 headers: { 32 "Access-Control-Allow-Origin": "", 33 "Access-Control-Allow-Methods": "GET", 34 "Access-Control-Allow-Headers": "*" 35 } 36 }) 37 .then((response) => { 38 if(response.ok){ 39 return response.json().then(resJson =>{ 40 console.log(JSON.stringify(resJson)); 41 }); 42 }else{ 43 throw new Error("リクエストが取得できませんでした。"); 44 } 45 46 }).then(resJson =>{ 47 return resJson; 48 }); 49} 50 51//地図を生成 52function createMap() { 53 //以下のコードは次のWebサイトを参考にしている:http://www.nowhere.co.jp/blog/archives/20180705-160052.html 54 const map = L.map('map'); 55 // タイルレイヤーを作成し、地図にセットする 56 L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { 57 maxZoom: 18, 58 attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html" target="_blank">国土地理院</a>', 59 }).addTo(map); 60 61 // 地図の中心座標とズームレベルを設定する 62 map.setView([app.lat, app.lon], 13); 63 //目的地用のアイコンを生成 64 const targetMarker = L.AwesomeMarkers.icon({ 65 markerColor: 'orange' 66 }); 67 //現在地にマーカーを付ける(そのままだと見づらいので) 68 const currentLocation = L.marker([app.lat, app.lon]).addTo(map); 69 currentLocation.bindPopup("現在地"); 70 71 const targetLon = NaN; 72 const targetLat = NaN; 73 //YahooAPIで条件に合う店舗を検索し、緯度経度を取得する 74 //検索対象をURLエンコードする 75 const KeyWord = encodeURIComponent(app.target); 76 const JsonResult = GETYahooRequest(KeyWord, app.lon, app.lat); 77 //TODO: ルートを表示する(無理ならしなくてOK) 78 //検索結果の場所にマーカーを立てる 79 const targetLocation = L.marker([targetLat, targetLon], {icon:targetMarker}).addTo(map); 80 targetLocation.bindPopup("最寄りの"+app.target); 81 82}

試したこと

以下のサイトを元に、CORSのことについて調べたのですが、解決方法は分かりませんでした。

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

使用したライブラリ・プラグイン

  • vue.js:バージョン2.6.14
  • leaflet:バージョン1.3.1
  • Leaflet.awesome-markers plugin:バージョン2.0
  • 開発に使用しているブラウザ:Chrome(バージョン:91.0.4472.114)
  • 開発に使用しているエディタ:VS Code
nikkorin.yuki👍を押しています

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

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

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

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

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

yuki84web

2021/06/29 11:37

アクセストークン取得してますか?
BraveDragon

2021/06/30 08:34

アクセストークンにつきましては、Yahoo IDを取得した上で、正規の手順でアプリケーションを登録してアアプリケーションIDを取得しています。
guest

回答1

0

ベストアンサー

以下のドキュメントのJSONPによる呼び出しを使えば良いと思います。具体的には、callbackパラメータにcallback関数名を指定します。

YOLP(地図):Yahoo!ローカルサーチAPI - Yahoo!デベロッパーネットワーク

素のJavaScriptでは面倒ですが、単に試すだけであれば、以下のようにすればよいでしょう。実用にするには適当なJavaScriptライブラリ(jQueryでも可)を検討してください。

HTML

1<script> 2funcation callbackFunc(res) { // callback関数 3 // resにAPIからの返り値がオブジェクトとして入っている 4} 5</script> 6<script src="https://map.yahooapis.jp/search/local/V1/localSearch?appid=XXXX&callback=callbackFunc&..."></script>

投稿2021/06/29 12:26

ockeghem

総合スコア11701

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

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

BraveDragon

2021/07/01 04:19

ご回答誠にありがとうございます。頑張ってやってみます。
BraveDragon

2021/07/01 04:29

回答にあるソースコードに従ってやってみた結果、エラーが無事解決しました。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問