2016-07-21 28 views
1

Ich bin neu in IONIC-2 und eine Verbindung herstellen möchten meine mobile App Odoo - open source ecommerce .. diese Verbindung beinhaltet einige JSONP Anfrage zu lösen .. Ich habe das gleiche durch jQuery zuvor .. seine Arbeits getan richtig in phonegap App .. aber während ich mit IONIC-2 das gleiche tue es gibt mir CORS und JSONP Fehler ..Wie CORS Ausgabe und JSONP Ausgabe in Ionic2

mir jemand dabei helfen kann ..

mein vorheriger jQuery Code ist ..

/****** index.js ******/ 

function json(url, params) { 
    var deferred = jQuery.Deferred(); 

    uniq_id_counter += 1; 
    var payload = { 
     'jsonrpc': '2.0', 
     'method': 'call', 
     'params': params, 
     'id': ("r" + uniq_id_counter) 
    }; 

    rpc_jsonp(url, payload).then(function (data, textStatus, jqXHR) { 
     if (data.error) { 
      deferred.reject(data.error); 
     } 
     deferred.resolve(data.result, textStatus, jqXHR); 
    }); 

    return deferred; 
} 


function rpc_jsonp(url, payload) { 

    // extracted from payload to set on the url 
    var data = { 
     session_id: window.localStorage.getItem("session_id"), 
     id: payload.id 
    }; 

    var ajax = { 
    type: "POST", 
    dataType: 'jsonp', 
    jsonp: 'jsonp', 
    cache: false, 
    data: data, 
    url: url 
    }; 

    var payload_str = JSON.stringify(payload); 
    var payload_url = jQuery.param({r: payload_str}); 
    if (payload_url.length < 2000) { 
     // throw new Error("Payload is too big."); 
    } 

    console.log(ajax); 
    ajax.data.r = payload_str; 
    console.log(ajax); 
    return jQuery.ajax(ajax); 

} 
/****** index.js ******/ 

ich oben custom json Funktion Login.html Datei .. nenne

/****** login.html ******/ 

function login(){ 

    var base_url = 'MY_SERVER_URL'; 
    json(base_url+'web/session/authenticate', { 
     'base_location': base_url, 
     'db':'myDB', 
     'login': 'admin', 
     'password':'admin' 
    }).done(function (data) { 

    if(data.uid != false){ 
     alert(data); 
    } 
    else{ 
     alert('Invalid Username or Password.'); 
    } 

    deferred.resolve(); 
}).fail(function(data){ 
    alert('Invalid Username or Password.'); 
}); 

    return deferred; 
} 
/****** login.html ******/ 

Ich folgte versucht, Code in IONIC 2 während service

/****** OdooJsonService.ts ******/ 
import { Injectable } from '@angular/core'; 
import { Http, Jsonp, JSONP_PROVIDERS, Headers, RequestOptions } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/Rx'; 

@Injectable() 
export class OdooJsonService { 
//data: any; 
uniq_id_counter: number; 
payload: any; 
result_rpc: any; 

constructor(private http: Http, private jsonp: Jsonp) { 
    this.http = http; 
    //this.data = null; 
} 

json(url, params) { 

    this.uniq_id_counter = this.uniq_id_counter + 1; 

    this.payload = JSON.stringify({ 
     'jsonrpc': '2.0', 
     'method': 'call', 
     'params': params, 
     'id': ("r" + this.uniq_id_counter) 
    }); 

    return this.rpc_jsonp(url, this.payload) 
        .map(res => res.json()) 
        .catch(this.handleErrorOne); 
} 

rpc_jsonp(url, payload) { 

    let data = JSON.stringify({ 
     //session_id: window.localStorage.getItem("session_id"), 
     id: payload.id 
    }); 

    let ajax = JSON.stringify({ 
     type: 'POST', 
     dataType: 'jsonp', 
     jsonp: 'jsonp', 
     cache: false, 
     data: data, 
     url: url 
    }); 

    let headers = new Headers({ 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 
           'Access-Control-Allow-Methods': 'PUT, GET, POST', 
           'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'}); 
    let options = new RequestOptions({ headers: headers }); 

    return this.http.post(url, ajax, options) 
     .map(res => res.json()) 
     .catch(this.handleErrorTwo); 
} 

handleErrorOne(error) { 
    console.error(error); 
    return Observable.throw(error.json().error || 'Server error'); 
} 

handleErrorTwo(error) { 
    console.error(error); 
    return Observable.throw(error.json().error || 'Server error'); 
} 

}  // End of OdooJsonService 
/****** OdooJsonService.ts ******/ 

zu schaffen und ich oben service in Login.ts

bin mit
/****** login.ts ******/ 
import { Component } from '@angular/core'; 
import { App, NavController, MenuController, ViewController } from 'ionic-angular'; 
import { TaskListPage } from '../task-list/task-list'; 

import { Http, Jsonp, JSONP_PROVIDERS } from '@angular/http'; 
import { OdooJsonService } from '../../providers/odoo-json-service/odoo-json-service'; 

@Component({ 
    templateUrl: 'build/pages/login/login.html', 
    providers: [OdooJsonService, JSONP_PROVIDERS] 
}) 
export class LoginPage { 
    public data: any; 

    constructor(private nav: NavController, public odooJsonService: OdooJsonService) { 
    this.odooMethod(); 
    } 

    odooMethod() { 
     this.odooJsonService 
      .json('MY_SERVER_URL/web/session/authenticate', {'base_location': 'MY_SERVER_URL', 
        'db':'myDB', 'login': 'admin', 'password':'admin'}) 
      .subscribe(odooData => { 
       this.data = odooData; 
       console.log(JSON.stringify(this.data)); 
      }); 
    } 

} 
/****** login.ts ******/ 

Fehler in der Konsole: (Chrom)

XMLHttpRequest cannot load https://MY_SERVER_URL/web/session/authenticate. 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. The response had HTTP status code 500. 

Fehler in der Konsole: (firefox)

/web/session/authenticate: Function declared as capable of handling request of type 'json' but called with a request of type 'http' 

Ich bin nicht sicher, ob dies der richtige Ansatz ist .. Kann jemand führen, dies zu tun in richtige Reihenfolge ..

wie kann ich das gleiche erreichen in IONIC 2 ??

Vielen Dank im Voraus.

Antwort

3

Sie können dieselbe Herkunftsrichtlinie in Chrome deaktivieren.

  1. Erstellen Sie ein separates Chrom-Symbol auf Ihrem Desktop.

Dual Chrome

  1. das Symbol Umbenennen Chrom (x-Domain), so dass Sie wissen, was was ist.

Chrome rename

  1. Rechts auf dem neuen Symbol klicken und dann auf Eigenschaften.

Properties

  1. Ändern Sie das Zielfeld zu "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-agent="Android" --user-data-dir="C:/temp-chrome-eng"

Target Field

  1. Klicken Sie auf OK.

Die Magie geschieht hier:

--disable-web-security 

Wenn Sie Ihren Browser öffnen wird es wie folgt aussehen:

Finished

ACHTUNG: nur zu Testzwecken, da dies BROWSER SECURITY HAT BEHINDERT.

0

Der Fehler, den Sie erhalten, liegt daran, dass Ihr Browser die ursprungsübergreifenden AJAX-Anforderungen blockiert (die Domäne antwortet nicht mit den erforderlichen Headern). Wenn Sie die Anwendung auf einem mobilen Gerät ausführen, sollte dies jedoch funktionieren, da die Anwendung die Anforderung direkt ausführt. Sie können mehr lesen here. Funktioniert es, wenn Sie die App auf einem mobilen Gerät starten?

+1

Kuba ist richtig. Es sollte funktionieren, wenn Sie Ihre App auf einem Android- oder iOS-Gerät ausführen. Zum Testen im Browser siehe meine Antwort unten. – MasterProgrammer200

+0

Auf dem Gerät gibt es kein Erfolgs- oder Fehlerprotokoll. Ich verstehe nicht, ob mein Code falsch ist oder etwas anderes, was zählt. – VaibsVB

+0

Ich hatte Probleme mit HTTPS mit dieser, hat die API-Site korrekte Zertifikate von Android akzeptiert? Wenn es möglich ist, versuchen Sie es zuerst mit HTTP. Und setzen Sie einen Haltepunkt in den Code, so dass Sie sehen, ob es tatsächlich ausgeführt wird. –

0

Ich bin im Browser unter Verwendung CORS extensions und plugins auf beiden chrome und mozilla ausgeführt. immer noch gibt es keinen Erfolg.

Ich verstehe nicht, ob mein Code falsch ist oder etwas anderes, was zählt.

EDIT: Folgen Sie unten zwei Kommentare, um Web-Sicherheit von Chrom auf MAC-Maschine zu deaktivieren.

+0

Ich löste CORS Problem im Browser durch Deaktivieren der Web-Sicherheit von Chrom vorübergehend nur für Entwicklungszwecke .. und änderte meine JSONService-Code .. – VaibsVB

+0

deaktivieren Sie die Web-Sicherheit von Chrome auf Mac-Maschine mit folgendem Befehl. 'open -n -a" Google Chrome "--args --user-data-dir =/tmp/temp_chrome_user_data_dir_for_cordova http: // localhost: 8100/index.html --disable-web-security' Dies erstellt eine weitere Instanz von Chrome mit Sicherheit ist deaktiviert. – VaibsVB

0

hatte ich Problem ionischen zu verwenden und iis auf gleiche url (localhost: 8100) diese Chrome-Erweiterung mir helfen cors Problem zu lösen:

https://chrome.google.com/webstore/detail/moesif-origin-cors-change/digfbfaphojjndkpccljibejjbppifbc

auch für Web-api [link Beschreibung hier eintragen] Sie können

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, 
DELETE, OPTIONS" /> 
     </customHeaders> 
    </httpProtocol> 
... 
</system.webServer> 

stellen Sie sicher, innerhalb system.webServer-Tag in der Datei web.config diesen Frieden Code setzen Sie Ihre Header korrekt ist:

let headers = new HttpHeaders(); 
headers = headers.set('Content-Type', 'application/x-www-form-urlencoded'); 
headers.append('Access-Control-Allow-Origin','*'); 
headers.append('Access-Control-Allow-Methods','GET,PUT,POST,DELETE'); 
headers.append('Access-Control-Allow-Headers','Content-Type');