CRUD&JSONP /煎茶触摸2(CRUD & JsonP / Sencha Touch 2)

2019-06-23 22:39发布

什么是通过代理类型“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();

但我得到的错误: 未捕获的错误:[错误] [Ext.data.proxy.Server#创建] JSONP代理只能用于读取数据。

如何更新的记录数据 - 通过代理把它上传到数据库?

Answer 1:

您正在处理CORS(跨源资源共享),默认情况下,在这种尊重所有brwsers和所有的web服务器都默认设置为不允许CORS请求。 更多关于CORS 这里

如果你是Web开发人员,并有网络服务器,但你需要使用JavaScript访问一些外部公司API,最简单的办法是设置您的服务器作为Web代理。 下面是一些服务器的步骤

(大师的读者,欢迎随时添加更多的服务器CONFIGS因为我proclamed这是维基)

Appache使用mod_proxy和mod_proxy_http

打开你的虚拟主机文件,并添加这些行(foirst使国防部代理-进一步阅读这里 )

ProxyPass /proxy http://domainname.com/
ProxyPassReverse /proxy http://domainname.com/

Nginx的

如果你正在使用NGIX为您的应用程序添加configarion线如下因素

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

进一步阅读这个链接 。

IIS

如果您使用的是IIS服务器

该配置是较为复杂一下,然后上面这些,但你可以找到所有关于它在这里

对于所有上面的例子,而不是利用有限的JSONP功能,现在你可以为你服务的服务器上的API使用Ajax和JSON从响应。


是的,你可以用PhoneGap的也毫不费力地使用它

我可以说在biggining一两件事。 你要么拿蓝色药片或红色药丸:)我joing但有两种方法。 有,又一个involes,你自己的服务器配置如上和第二是弄脏手的PhoneGap本地插件。

第一种方法(Web服务器拥有者)

需要你有自己的Web服务器。 您将需要mod_proxy的上述CONFIGS,所以你可以隐藏你的服务和代理从您的PhoneGap应用程序的所有HTTP请求背后实实在在的服务。 您还必须包括在返回到PhoneGap的应用程序响应CORS(跨源资源共享)标头。 也可以考虑,因为你是暴露的内容世界的认证,以确保这一点。 您的PhoneGap应用shold验证您的web服务,至少,槽基本HTTP认证通过HTTPS。

按照这个步骤来完成安装:

阿帕奇

在Apache服务器,首先启用模块“头”

$ 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(煎茶触摸),对于像buffer.SlowBuffer AJAX请求设置的用户名和密码();

你需要第一种方法来收拾AUTH头

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

要CORS启用微软IIS6,请执行以下步骤:

  1. 打开Internet信息服务(IIS)管理器
  2. 右键单击该网站,你要启用CORS并转到属性
  3. 更改为HTTP头选项卡
  4. 在自定义HTTP头部分,单击Add
  5. 输入访问控制允许来源为头名
  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';

 }

谷歌应用程序引擎可以是有益的太

既然是长期以适应这个盒子,我只会给一个博客,所有正确exlained提供链接

链接

......而关于第二个方法是什么

那么它涉及到一些本地编码至少你需要的PhoneGap插件PhoneGap的代理,你可以找到这里 ,但我会避免“本土”以来的PhoneGap的一点是使用单一代码具有多平台的应用程序......哦,如果你想做你的“特殊”插件写在这里的本机代码是很好的例子,如何做同样的事情,对于Facebook API

现在一切由你来决定哪种方法你将采取;)



文章来源: CRUD & JsonP / Sencha Touch 2