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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

3195閲覧

CORSをヘッダーで許可をしてもWebAPIのJSONを取得できない

southern_flavor

総合スコア70

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/04/28 18:22

編集2020/05/01 10:08

##わからないこと
スプレッドシートの項目をWebAPIとして使用すべく、ウェブアプリケーションとして公開後、Fetch APIで取得できないか試しました。
WordPress上で使用しています。
Access-Control-Allow-Originのエラーが発生し、JSONをうまく取得できません。
どのようにすれば、取得できるようになるのでしょうか?

発生しているエラー

次の二つのエラーが発生しています。
ccess to fetch at 'https://script.google.com/macros/s/[スプレッドシートのid]/exec' from origin 'http://localhost:9200' 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.

GET https://script.google.com/macros/s/[スプレッドシートのid]/exec net::ERR_FAILED

試したこと

調べたところ、admin-ajax.php、functions.phpに
次のように追加する方法もあるらしく、試しましたが変化はなかったです。

admin-ajax.php header( 'Access-Control-Allow-Origin: *' );
functions.php function add_cors_http_header(){ header("Access-Control-Allow-Origin: *"); } add_action('init','add_cors_http_header');

##コード

javascript

1 postData('https://script.google.com/macros/s/[スプレッドシートのid]/exec') 2 .then(data => console.log(JSON.stringify(data))) 3 .catch(error => console.log(error)); 4 5 function postData(url = '') { 6 return fetch(url, { 7 method: "GET", 8 mode: "cors", 9 cache: "no-cache", 10 headers: { 11 "Content-Type": "application/json; charset=utf-8", 12 "Access-Control-Allow-Origin": "*" //ここにも追加しました 13 }, 14 }) 15 .then(response => response.json()); 16 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Access-Control-Allow-Originヘッダはクライアント側からサーバ側へ提供するヘッダではなくサーバ側からクライアント側へ提供されるヘッダのため、リクエストヘッダに付与したところで意味を持ちません。
GASを公開する際に公開範囲を自分のみに設定したままだったりはしないでしょうか?
全員(匿名ユーザーを含む)を選択しないとFetchAPI等では利用することができません。

投稿2020/04/28 18:38

編集2020/04/28 18:42
rozeo_s

総合スコア110

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

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

southern_flavor

2020/04/28 18:51

ご回答ありがとうございます。 クライアント側から指定しても意味ないんですね。 GASの公開範囲ですが、Who has access to the app:を全ユーザにしていて、念のため再度設定しましたが、変わらないです。。
rozeo_s

2020/04/28 18:54

全ユーザと全ユーザ(匿名ユーザーを含む)があって後者じゃないとダメなようです(先程試した) 英語だとAnyone, even anonymousになります。 あと若干この辺曖昧なんですがバージョン更新しないと権限等が変わらないこともあるので一度確認してみるといいかもしれません。
southern_flavor

2020/04/29 06:26

Anyone, even anonymousに変更してバージョンをNEWにしましたが状況は変わらずでした。 GAS自体に問題があるのかと思い、各関数に対してデバッグもしましたが特に問題なく出力されたJSONの形式も正しかったです。 Access-Control-Allow-OriginヘッダはApacheの設定ファイルやhtaccessにも設定する方法があるようですが、すでにPHP側で設定していたら意味ないでしょうか?
rozeo_s

2020/04/29 09:11

Access-Control-Allow-OriginヘッダはGAS側から提供されるものなのでPHPは関係ありません。 GASへはjavascriptのfetchAPIを使ってリクエストしてますよね? 一応自分の方では上記のような設定をすれば以下のような最小コードで問題なくリクエストできるので… fetch('url', { method: "GET", mode: "cors", cache: "no-cache", }) .then((response) => response.json())   .then((p) => console.log(p));
rozeo_s

2020/04/29 09:54 編集

あ、わかった…本来不要の Content-Type ヘッダに application/json 指定してることが原因ですね… GAS、 Content-Type が application/jsonだとCORSでコケるらしく、GETなら無視するのかと思ってたんですがダメっぽいですね… GASはCORSのPreflight Requestに対応してないらしく、POST時はダメだとは知ってたんですけど、Content-Type入れちゃうとfetchAPIがPreflightリクエスト飛ばしちゃうようですね… 本質としては そもそもGETリクエストには レスポンスボディ自体ないので Content-Typeの指定がいらないです なので、上記コードの headers 部分を消せば動くかと思います。 あと今更ですが CROS ではなく CORS(Cross-Origin Resource Sharing)なのでご注意を…
southern_flavor

2020/05/01 10:06

ありがとうございます。問題なく取得できました! Content-Type ヘッダをとってみたら、取得できました。 これには目がいかなかったので、FetchAPIのリファレンスのほうもよく確認するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問