2017-04-04 21 views
0

Angular 2を使用しているIonic CLIを使用して新しいプロジェクトを作成しました。Google Place APIを呼び出そうとしていますが、引き続きCORSの問題が発生しています。 APIを呼び出してPostmanとChrome内でデータを取得することはできますが、Ionicアプリケーション内で呼び出しを行うと機能しません。Google Places APIを呼び出すときの2 CORSの問題

これは私がブラウザコンソールで取得しています現在のエラーです:ここでは

XMLHttpRequest cannot load https://maps.googleapis.com/maps/api/place/textsearch/json?query=steak&key=API_KEY_GOES_HERE. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access. 

は、私はいくつかのヘッダを追加しようとした後、私は私のプロバイダを持っているコードです:

import { Injectable } from '@angular/core'; 
import { Http, Headers, RequestOptions } from '@angular/http'; 
import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/operator/map'; 

import { Place } from '../models/place'; 

@Injectable() 
export class Places { 

    private apiKey = "KEY_GOES_HERE"; 
    private apiUrl = "https://maps.googleapis.com/maps/api/place"; 
    private headers = new Headers({ 'Accept': 'application/json' }) 
    private options = new RequestOptions({}); 

    constructor(public http: Http) { 
    this.headers.append("Access-Control-Allow-Origin", "*"); 
    this.headers.append("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); 
    this.headers.append("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    this.options.headers = this.headers; 
    } 

    getPlaces(keyword:string): Observable<Place[]> { 
    return this.http.get(`${this.apiUrl}/textsearch/json?query=` + encodeURIComponent(keyword) + `&key=` + this.apiKey, this.options) 
     .map(res => <Place[]>res.json()); 
    } 


} 

私のイオンアプリケーションでAPI呼び出しを行うことができないのはなぜですか?どうすれば修正できますか?

ヘッダーを削除すると、一般的なCORSエラーが発生します。

答えて

2

CORSトグルGoogle Chromeの拡張機能を使用します。 CORSはデフォルトでクロムでローカルホストに対して無効にされています

0

CORSトグルクロール拡張は開発作業には最適ですが、プロダクションに移行しても問題は解決しません。

私は最後の数日間、このための最もクリーンな解決策を見つけようと多くの運を費やしていませんでした。 GoogleではクライアントサイドのJavaScriptライブラリを提供しています。しかし、それを使用するには、あなたが完全に同意していないindex.htmlのスクリプトファイルをハードコードする必要があります(デバイスにインターネット接続がないとどうすればエラーを処理できますか)。

それは、APIのv2からv3に移動した後には、JSONPが推奨されなくなりました。なぜなら、これは理想的な回避策だったからです。

代わりに、CORS用に正しく構成され、IonicアプリケーションとGoogle APIの間のプロキシとして機能する、超シンプルなNodeJS/Expressバックエンドを設定することが唯一の唯一の解決策でした。

初めてNodeを試してみましたが、これを設定するのはあまり難しくありませんでした。私はここにガイドを書いた:https://www.technouz.com/4674/use-google-places-api-ionic-3-simple-nodejs-backend-heroku/とここでサンプルギフトレポを作成:https://github.com/zuperm4n/super-simple-nodejs

関連する問題