首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决Ionic2中的CORS问题和JSONP问题

如何解决Ionic2中的CORS问题和JSONP问题
EN

Stack Overflow用户
提问于 2016-07-21 11:06:59
回答 4查看 2.6K关注 0票数 2

我是IONIC-2的新手,想把我的移动应用程序连接到Odoo - open source ecommerce上。这个连接涉及一些JSONP请求。我以前也通过jQuery做过同样的事情。它在phonegap应用程序中正常工作。但是当我用IONIC-2做同样的事情时,它会给我CORSJSONP错误。

有人能帮我吗..。

我以前的jQuery代码是..

代码语言:javascript
复制
/******  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 ******/

我正在调用上面的custom json函数Login.html文件。

代码语言:javascript
复制
 /******  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 ******/

在创建IONIC 2时,我尝试遵循service中的代码

代码语言:javascript
复制
/****** 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 ******/

我正在使用上面的serviceLogin.ts

代码语言:javascript
复制
/****** 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 ******/

控制台错误:(chrome)

代码语言:javascript
复制
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.

控制台错误:(firefox)

代码语言:javascript
复制
/web/session/authenticate: Function declared as capable of handling request of type 'json' but called with a request of type 'http'

我不确定这是否正确。有谁能引导我们按照正确的顺序来做这件事吗?

我如何在IONIC 2中实现同样的目标??

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-21 17:31:11

您可以在Chrome中禁用相同的源策略。

  1. 在桌面上创建一个单独的铬图标。

  1. 将该图标重命名为chrome (x域),以便您知道哪个是哪个。

  1. 右键单击新图标并单击“属性”。

  1. 将目标字段更改为"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-agent="Android" --user-data-dir="C:/temp-chrome-eng"

  1. 点击Ok。

魔法就发生在这里:

代码语言:javascript
复制
--disable-web-security

打开浏览器时,它将如下所示:

警告:仅用于测试目的,因为此浏览器已禁用安全性。

票数 5
EN

Stack Overflow用户

发布于 2016-07-21 17:12:35

您所收到的错误是因为您的浏览器阻塞了跨源AJAX请求(域没有响应所需的标头)。但是,如果您在移动设备上执行应用程序,它应该可以工作,因为应用程序将直接执行请求。您可以阅读更多的here。如果你在移动设备上启动这个应用程序,它会起作用吗?

票数 0
EN

Stack Overflow用户

发布于 2016-07-22 10:47:09

我在浏览器上运行,使用CORS extensionspluginschromemozilla上运行。但还是没有成功。

我不知道我的代码是错的还是其他重要的东西。

编辑:遵循下面的两个注释,以禁用网页安全的铬上的MAC机。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38502609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档