Использование Jsonp в прокси в модели в extjs 4.2.1

Я вызываю веб-службу отдыха из sencha extjs 4.2.1 в модели. Моя модель

Ext.define('AM.model.User', {
    extend: 'Ext.data.Model',
    fields: [
    {name: 'subCategoryName',  type: 'string'},
    ],
    proxy:{
    type : 'jsonp',
    callbackKey: 'callback',

            url: 'http://192.168.1.10:8080/CredoCustomerConnect/subcategory/getsubcategorylist/1/1/0',
         headers: {
             'Accept': 'application/json'
         },
          callback: function( data ) {             
             console.log("callback" + data);        
    },
    listeners: {
               load: function() {   
                   console.log("in load");
                }
                   },

       reader: {
           type: 'json',
           rootProperty:'subcategory'
           }
        }

}); 

Когда я вызываю URL-адрес 'http://192.168.1.10:8080/CredoCustomerConnect/subcategory/getsubcategorylist/1/1/0',

в браузере я получаю результат вроде

callback({"listException":"false","listSize":"5","nextPage":"false","pageNumber":"0","subcategory":[{"isException":"false","categoryId":"1","categoryName":"Solutions","productSize":"4","subCategoryDescription":"Oracle Consulting","subCategoryId":"1","subCategoryName":"Oracle Consulting"},],"totalRecords":"5"})

Но я не вижу никаких данных в виде сетки.

Метод Rest Web-сервиса

@GET
     @Path("getsubcategorylist/{categoryId}/{userId}/{pageNumber}")
     @Consumes("application/x-www-form-urlencoded")
     //@Produces({MediaType.APPLICATION_JSON})
     @Produces({"application/javascript"})
     public JSONWithPadding   getSubCategorylist(@PathParam("categoryId") int categoryId,@PathParam("userId")int userId,@PathParam("pageNumber") int pageNumber, @QueryParam("callback") String callback)
     {

         SubCategoryList subCategory = new SubCategoryList();
         SubCategoryEntityHandler handler = new SubCategoryEntityHandler();
         try {
             subCategory =  handler.getSubCategoriesList(categoryId,pageNumber);

             return new JSONWithPadding(
                        new GenericEntity<SubCategoryList>(subCategory) {
                        },callback);

        } catch (Exception e) {
            e.printStackTrace();
            subCategory.setListException(true);
            subCategory.setListMessage(e.getMessage());
                        return new JSONWithPadding(
                    new GenericEntity<SubCategoryList>(subCategory) {
                    }, "callback");
        }    
     }

Мой магазин

 Ext.define('AM.store.Users', {
        extend: 'Ext.data.Store',

        config: {
        model: 'AM.model.User',


        }
    });

мое мнение

Ext.define('AM.view.user.List' ,{
    extend: 'Ext.grid.Panel',
    alias: 'widget.userlist',

    title: 'All Users',
    store: 'Users',

    initComponent: function() {


        this.columns = [
            {header: 'Subject',  dataIndex: 'subCategoryName',  flex: 1},

        ];

        this.callParent(arguments);
    }
});

В консоли нет ошибки. Но я не вижу никаких данных в сетке. Как это решить?


person Prabhu M    schedule 05.06.2013    source источник


Ответы (2)


Ваш сервер не должен возвращаться просто:

callback({...})

Вместо этого он должен прочитать значение параметра запроса GET, которое вы настроили как callbackKey (в вашем случае это «обратный вызов»), и использовать это значение в качестве имени обратного вызова в ответе. См. раздел «Реализация на стороне сервера» в документе Прокси-документ JsonP.

Например, для своего первого запроса прокси будет использовать такой URL-адрес:

http://192.168.1.10:8080/CredoCustomerConnect/subcategory/getsubcategorylist/1/1/0?callback=Ext.data.JsonP.callback1

Таким образом, ответ сервера должен быть:

Ext.data.JsonP.callback1({ ... })

Второй URL-адрес запроса будет выглядеть примерно так:

http://192.168.1.10:8080/CredoCustomerConnect/subcategory/getsubcategorylist/1/1/0?callback=Ext.data.JsonP.callback2

И т. д. и т. д.

person rixo    schedule 05.06.2013
comment
Я обновил остальной код веб-службы. Не могли бы вы объяснить мне подробно - person Prabhu M; 06.06.2013
comment
Из-за пожарной ошибки: URL-адрес запроса 192.168.1.10:8080/CredoCustomerConnect/subcategory/ Ответ сервера: Ext.data.JsonP.callback1({ ... }). даже в ответе я вижу данные. В чем проблема с моим кодом - person Prabhu M; 06.06.2013

Из документов Extjs:

Прокси-сервер JsonP создает временную функцию обратного вызова, ожидает ее вызова, а затем помещает данные в прокси-сервер, делая их такими же, как вы загрузили их через обычный AjaxProxy.

Этот код работал для меня после небольшой настройки

Ext.define('My.Model', {
extend: 'Ext.data.Model',
fields: [
    'id', 'name'
],
proxy:{
    type : 'jsonp',
    url: 'http://127.0.0.1:8080',
    reader : {
        type : 'json',
        root : 'data'
    }
}

My.Model.load(1, {
                    callback: function(data) {
                    console.log(data);
                }
            });

Сторона сервера:

 // Retrieve the callback parameter
    cb = parms.get("callback");
    // Build response string
    msg = cb + "({ \"data\": [{\"id\": 1, \"name\": \"" + "username" + "\"}] });";
    //Return msg with status 200 OK and "text/javascript" header
person Danny    schedule 16.09.2013