什么是通过代理类型“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代理只能用于读取数据。
如何更新的记录数据 - 通过代理把它上传到数据库?
您正在处理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,请执行以下步骤:
- 打开Internet信息服务(IIS)管理器
- 右键单击该网站,你要启用CORS并转到属性
- 更改为HTTP头选项卡
- 在自定义HTTP头部分,单击Add
- 输入访问控制允许来源为头名
- 输入*为标头值
- 单击确定两次
可选,设置基本身份验证,这是直接的过程。
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
现在一切由你来决定哪种方法你将采取;)