1

我知道 .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
});

但这会将参数添加到查询字符串中(ps:我还没有让它工作)。我认为在请求正文中包含这个更有意义(类似于使用 http post 提交表单)。

我有以下问题:

  1. 我如何做到这一点?
  2. 当我在服务器端 api 中有复杂类型时会发生什么?(注意:这将很快需要,因为 asp.net web api 仅支持单一复杂类型,所以无论如何我都必须重构“类参数”)?
  3. 这是推荐的方法吗?

完整代码如下:

店铺:

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

1 回答 1

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}/....

或者

http://localhost/noobapis/api/bill/outstanding?userid={userid}&location={locations_separed_by_delimeter}
于 2013-03-04T13:48:27.510 回答