CRUD & JsonP / Sencha Touch 2

7
什么是通过代理类型“jsonp”上传记录的适当方式? 我正在尝试使用代理类型“jsonp”同步存储,但是我收到错误消息。
这是模型:
Ext.define("Sencha.model.User", {
    extend:"Ext.data.Model",
    //idProperty:"",


    config:{
        fields:[
            'userID',
            'userName',
            'userEmail'
        ],


        proxy: {
            type: 'jsonp',
                create  : 'http://domainname.com/users.php?action=insert',
                read    : 'http://domainname.com/users.php?action=fetchAll',
                update  : 'http://domainname.com/users.php?action=update',
                destroy : 'http://domainname.com/users.php?action=delete'
            },
            callbackKey: 'callback',
            reader: {
                type: 'json',
                rootProperty: 'Users',
                successProperty: 'success',
                messageProperty: 'message'
            },
            writer: {
                type: 'json',
                writeAllFields: false,
                encode: true
            }
        }
    }
});

商店:

Ext.define("Sencha.store.Users", {
    extend:"Ext.data.Store",
    config:{
        model:"Sencha.model.User",
        remoteFilter:false,
        remoteSort:true,
        autoLoad:true,
        }
    }
});

商店已更新:
Ext.getStore('Users').set('userName', 'Tom');

现在我想要更新数据库中的记录:

Ext.getStore('Objects').sync();

但我遇到了错误: 未捕获的错误:[ERROR][Ext.data.proxy.Server#create] JsonP代理只能用于读取数据。 我该如何更新记录数据-通过代理将其上传到数据库?
1个回答

7
你正在处理 CORS(跨域资源共享)。默认情况下,在所有浏览器中都会尊重此设置,所有 Web 服务器默认设置为不允许 CORS 请求。更多关于 CORS 的信息请查看这里
如果你是一名 Web 开发人员,并且有 Web 服务器但需要从 JavaScript 访问某些外部公司 API,最简单的方法是将你的服务器设置为代理服务器。以下是一些服务器的步骤:
(大师级读者可以在此添加更多服务器配置,因为我已经宣布这是一个维基百科)

使用 mod_proxy 和 mod_proxy_http 的 Apache

打开你的虚拟主机文件并添加以下行(首先启用 mod proxy,更多信息请参见这里)。
ProxyPass /proxy http://domainname.com/
ProxyPassReverse /proxy http://domainname.com/

Nginx

如果您正在使用 Nginx 进行应用程序配置,请添加以下行:

location /proxy {
  proxy_pass        http://domainname.com/;
  proxy_set_header  X-Real-IP  $remote_addr; <-- maybe good to set
}

关于此链接的更多阅读内容。

IIS

如果您正在使用IIS服务器,则配置比上述配置复杂一些,但您可以在此处找到有关它的所有信息。

对于以上所有示例,现在您可以使用Ajax和JSON从响应中作为您正在服务器上提供该API,而不是使用受限的JSONP功能。


是的,您也可以轻松地将其与Phonegap一起使用

我可以说一件事情。你要么选择蓝色药丸,要么选择红色药丸:) 我开玩笑了,但有两种方法。一种涉及拥有自己的服务器并进行上述配置,第二种是使用Phonegap本机插件。

第一种方法(网络服务器所有者)

需要您拥有自己的Web服务器。您将需要上面的mod_proxy配置,以便您可以将真实服务隐藏在您的服务后面,并代理来自您的phonegap应用程序的所有HTTP请求。您还必须在返回给phonegap应用程序的响应中包含CORS(跨源资源共享)标头。还要考虑使用身份验证来保护此内容,因为您正在向全世界公开内容。您的phonegap应用程序应通过HTTPS进行基本HTTP身份验证来认证您的Web服务。

按照以下步骤完成设置:

Apache

在apache服务器上,首先启用“headers”模块

$ a2enmod headers

在代理配置之前或之后的虚拟主机文件中添加以下内容:

ProxyPass /proxy http://domainname.com/
ProxyPassReverse /proxy http://domainname.com/
# CORS allow to all
Header set Access-Control-Allow-Origin *
# Set basic authentication
<Location /proxy>
  AuthType Basic
  AuthName "Restricted Area"
  AuthBasicProvider file
  AuthUserFile /usr/local/apache/passwd/passwords
  Require valid-user # setup user/password in file above using htpasswd
</Location>

在PhoneGap(Sencha Touch)中,对于Ajax请求设置用户名和密码,可以像使用buffer.SlowBuffer()一样进行操作。

您需要先使用第一种方法来打包认证头文件。

function make_base_auth(user, password) {
  var tok = user + ':' + pass;
  var hash = Base64.encode(tok);
  return "Basic " + hash;
}

那么在您的代理中设置头部,方法如下:
headers : { Authorization : make_base_auth("some_username", "some_password") } // I know this is readable by other by you get the point.

IIS 6

要启用 Microsoft IIS6 的 CORS,请执行以下步骤:

  1. 打开 Internet Information Service (IIS) 管理器
  2. 右键单击要启用 CORS 的站点,然后转到属性
  3. 切换到 HTTP Headers 选项卡
  4. 在自定义 HTTP 标头部分,点击添加
  5. 将 Access-Control-Allow-Origin 输入为标头名称
  6. 将 * 输入为标头值
  7. 两次点击确定

可选的,设置基本身份验证,这是一个简单的过程。

IIS 7

还需考虑查看上述有关如何设置代理的文档,然后修改 web.config 文件并添加以下内容:

<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

nginx

在位置中添加以下内容

if ($request_method = 'OPTIONS') {

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain charset=UTF-8';
    add_header 'Content-Length' 0;

    return 200;
 }

 if ($request_method = 'POST') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 }

 if ($request_method = 'GET') {

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

 }

谷歌应用引擎也可以很有帮助

由于内容太长,无法适应此框,我将提供一个链接到其中一个博客的链接,其中所有内容都被正确解释了

链接

...那第二种方法呢

嗯,它涉及一些本地编码,至少您需要phonegap插件phonegap-proxy,您可以在这里找到它。但是,我会避免“native”,因为使用phonegap的重点在于使用单个代码具有多平台应用程序......哦,如果您想编写“特殊”插件来编写本地代码,在这里有一个很好的例子如何做同样的事情Facebook API

现在完全取决于您要采取哪种方法;)


很抱歉,这对我来说不是一个选项,因为该应用程序并非通过Web服务器提供,而是通过PhoneGap打包的移动应用程序。尽管如此,还是要点个赞,因为如果您正在使用Web服务器,这绝对是有帮助的。 - Jim O'Brien
好的,你仍然有选择,看看我的更新,因为我不知道你正在使用phonegap。 - Milan Jaric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接