1

.net と javascript は知っていますが、煎茶初心者です。クライアントで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ポストを使用したフォーム送信に似ています)。

次の質問があります。

  1. どうすればこれを達成できますか?
  2. サーバー側の API に複雑な型があるとどうなりますか? (注: asp.net Web API は 1 つの複雑な型しかサポートしていないため、これはすぐに必要になるため、とにかく「クラスへの引数」をリファクタリングする必要があります)?
  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);
        }
    });

このすべてのギャンの後、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 に答える