使用ajax调用加载存储数据,需要复杂类型作为参数?

时间:2013-03-04 07:52:18

标签: sencha-touch-2

我知道.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提交表单)。

我有以下问题:

  1. 我该如何实现这个目标?
  2. 当我在服务器端api中有复杂类型时会发生什么? (注意:由于asp.net web api只支持一个复杂的类型,所以很快就会需要这个,所以我不得不重构“类的参数”吗?
  3. 这是推荐的方法吗?
  4. 完整代码如下:

    存储

    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();
    },
    

1 个答案:

答案 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}