我知道.net和javascript,但在sencha中是一个菜鸟。我正在使用客户端上的sencha touch 2.0和服务器上的asp.net web api进行应用程序。我需要向用户显示项目列表(账单)。
目前,服务器端api的格式为:
GetList(int userId, string[] locationsIds, ...) { ... }
在客户端,商店有'autoLoad:false'。我在商店的代理上调用setExtraParams,如下所示:
billStore.getProxy().setExtraParams({
userId: getUserId(), //someFunction
locationIds: getUserSelectedLocations(), //someOtherFunction
});
但是这会将参数添加到查询字符串中(p.s:我还没有管理它以使其工作)。我认为在请求正文中使用它更有意义(类似于使用http post提交表单)。
我有以下问题:
完整代码如下:
存储
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();
},
答案 0 :(得分:0)
你必须提供
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}/....
OR
http://localhost/noobapis/api/bill/outstanding?userid={userid}&location={locations_separed_by_delimeter}