带Ext.Ajax.request的跨域Ajax



我似乎无法使用Ext.ajax.request进行跨域ajax调用。看起来ScriptTag:TTrue没有任何效果。

这是我的代码:

            {
            xtype: 'button',
            text: 'Search',
            ui: 'confirm',
            handler: function() {
                var query = Ext.getCmp("textquery").getValue();
                Ext.Ajax.request({
                    url: 'http://example.com/?search='+query,
                    dataType: 'jsonp',
                    jsonp: 'jsonp_callback',
                    scriptTag: true,
                    success: function(e) {
                        var obj = Ext.decode(e.responseText);
                        var msg = obj;
                        var html = tpl.apply(msg);
                        resultPanel.update(html);
                    }
                });
            }

控制台日志告诉我:

XMLHttpRequest cannot load http://example.com/?search=test&_dc=1326551713063. Origin http://myapp.lo is not allowed by Access-Control-Allow-Origin.

使用jquery,我也做了同样的事情,它也能工作,但我必须使用sencha touch。

              var formData = $("#callAjaxForm").serialize();
              $.ajax({
                url:"http://example.com/leksikonapi/",
                dataType: 'jsonp',
                jsonp: 'jsonp_callback',
                data: formData,
                success: onSuccess,
                error: onError
              });

我看不出两者有什么不同。

Sencha Touch 2的解决方案:使用Ext.data.JsonP

http://docs.sencha.com/touch/2-1/#/api/Ext.data.JsonP

尝试使用Ext.util.JSONP。我看不到使用Ext.Ajax在文档中执行JSONP的方法

是的,没错。它被称为同源策略——浏览器不会向javascript来源之外的任何域发出请求。如果您控制服务器,您可以使用CORS来通知浏览器发出请求。如果你不能控制服务器,你就必须编写一个服务器端代理。

由于CORS(跨来源资源共享),我在Chrome上遇到了同样的问题

浏览器将首先发送OPTIONS请求,然后期望返回一些HTTP标头,这些标头指示哪些来源是允许的。

我通过在服务器端进行一些设置解决了这个问题对于Ruby和Node.js服务器端来说,它们现在都工作得很好。

Node.js(感谢文章)

// Enables CORS
var enableCORS = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
        res.send(200);
    }else{
        next();
    }
};
// enable CORS!
app.use(enableCORS);

Ruby(感谢文章)

class ApplicationController < ActionController::Base
  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers
  # For all responses in this controller, return the CORS access control headers.
  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
    headers['Access-Control-Allow-Headers'] = 'Origin, Content-Type, Accept, Authorization, Token'
    headers['Access-Control-Max-Age'] = "1728000"
  end
  # If this is a preflight OPTIONS request, then short-circuit the
  # request, return only the necessary headers and return an empty
  # text/plain.
  def cors_preflight_check
    if request.method == 'OPTIONS'
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE, OPTIONS'
      headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version, Token'
      headers['Access-Control-Max-Age'] = '1728000'
      render :text => '', :content_type => 'text/plain'
    end
  end
end

相关内容

  • 没有找到相关文章

最新更新