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

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

我知道.net和javascript,但我在sencha是个笨蛋。我正在使用客户端上的sencha touch 2.0和服务器上的asp.net web api开发应用程序。我需要向用户显示项目(账单)列表

目前,服务器端api的形式如下:

GetList(int userId, string[] locationsIds, ...) { ... }
在客户端中,存储具有“自动加载:false”。我在商店的代理上调用setExtraParams,如下所示:

billStore.getProxy().setExtraParams({
    userId: getUserId(),                        //someFunction
    locationIds: getUserSelectedLocations(),    //someOtherFunction
});
但是这会将参数添加到查询字符串中(注意:我还没有设法让它工作)。我认为在请求主体中使用这个更合理(类似于使用HTTPPOST提交表单)

我有以下问题:

  • 我如何做到这一点
  • 当服务器端api中有复杂类型时会发生什么?(注意:由于asp.net web api只支持单一的复杂类型,所以我很快就需要这样做,所以无论如何我都必须重构“类的参数”)
  • 这是推荐的方法吗
  • 完整代码如下:

    商店:

    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}