Sencha touch 2 使用需要复杂类型作为参数的ajax调用加载存储数据?
我知道.net和javascript,但我在sencha是个笨蛋。我正在使用客户端上的sencha touch 2.0和服务器上的asp.net web api开发应用程序。我需要向用户显示项目(账单)列表 目前,服务器端api的形式如下:Sencha touch 2 使用需要复杂类型作为参数的ajax调用加载存储数据?,sencha-touch-2,Sencha Touch 2,我知道.net和javascript,但我在sencha是个笨蛋。我正在使用客户端上的sencha touch 2.0和服务器上的asp.net web api开发应用程序。我需要向用户显示项目(账单)列表 目前,服务器端api的形式如下: GetList(int userId, string[] locationsIds, ...) { ... } 在客户端中,存储具有“自动加载:false”。我在商店的代理上调用setExtraParams,如下所示: billStore.getProxy
GetList(int userId, string[] locationsIds, ...) { ... }
在客户端中,存储具有“自动加载:false”。我在商店的代理上调用setExtraParams,如下所示:
billStore.getProxy().setExtraParams({
userId: getUserId(), //someFunction
locationIds: getUserSelectedLocations(), //someOtherFunction
});
但是这会将参数添加到查询字符串中(注意:我还没有设法让它工作)。我认为在请求主体中使用这个更合理(类似于使用HTTPPOST提交表单)
我有以下问题:
Ext.define('noobapp.store.Bills',{
extend: 'Ext.data.Store',
config: {
storeId: 'billStore',
model: 'noobapp.model.Bill',
sorter: 'BillFrom',
proxy: {
type: 'ajax',
url : 'http://localhost/noobapis/api/bill/outstanding',
reader: 'json'
}
}
});
控制器:
_fetchOutstandingBills : function(data){
console.log(data);
var me = faomobile.app.getController('noobapis.controller.Main');
var billStore = Ext.getStore('billStore');
if(!billStore) billStore = Ext.create('noobapis.store.Bills');
billStore.getProxy().setExtraParams({
userId: getUserId(),
locationIds: getUserSelectedLocations(),
});
billStore.load();
},
你必须付出
method: 'POST'
在代理配置中,因为默认情况下,它使用GET,从而在URL中发送所有内容
您还可以在POST请求中发送复杂的JSON对象,如以下示例所示:
var obj = new Object();
obj.loginEntry = new Object();
obj.loginEntry.userid = username;
obj.loginEntry.password = password;
var data = Ext.JSON.encode(obj);
Ext.Ajax.request({
url : 'http://myservice/endpoint',
method : "POST",
headers: {
'Content-Type': 'application/json'
},
params : data,
useDefaultXhrHeader : false,
withCredentials: true,
success : function(response) {
console.log(response.responseText);
}
});
在经历了这么多gyan之后,我仍然建议不要使用POST
进行读取,因为按照惯例,它应该写而不是读。根据REST约定,您的只读服务应该是GET,并且应该遵循如下构造:
http://localhost/noobapis/api/bill/{userid}/outstanding/{locations_csv}/....
或
首先,我不是在做一个明确的ajax调用。我只是有一个配置了代理的商店。这特别是关于使用“http get+store.load()+json代理”。我已经知道显式ajax调用的可能性(new Ext.ajax.Request…)。但我宁愿不这样做,除非没有其他选择。这将需要在整个应用程序中更改我的整个模型/存储/代理约定。其次,上面给出的示例是简化的,我删除了id和位置以外的其他参数,但它们存在,它们是对象,而不是原语或数组。最后,我真的不想用post来阅读。我只希望在与存储和json代理一起使用时,能够将复杂类型传递给“get”端点。如果我有一个3级深嵌套对象作为参数,那么这与store+proxy+“get”操作模式如何匹配?是sencha还是非sencha?如何将嵌套对象发送到
get
服务?您只能选择url参数和标头(因为没有正文),并且两者都接受字符串数据,所以您可以做的最大工作就是将对象展平为JSON字符串并发送它。如果您想使用存储和代理方法,您可以使用任何url
&extraParams
创建proxy
对象,并将其设置为您的存储,如下所示:myStore.setProxy(myCustomProxy)
,然后再调用load()。是的,我的问题就是这样。因为我的端点需要这种类型的参数。因此,在本例中,我认为将操作更改为post是有意义的。问题是,我找不到将自定义数据添加到存储定义的代理的方法。我将尝试post+extraParams选项,看看效果如何。好的,事情进展如何?成功了吗?
http://localhost/noobapis/api/bill/outstanding?userid={userid}&location={locations_separed_by_delimeter}