• sencha touch结合webservice读取jsonp数据详解


    sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下:

    Ext.define('eparkapp.store.ParksNearby',{
        extend:'Ext.data.Store',
        requires: ['Ext.data.JsonP'],
        config:{
            model: 'eparkapp.model.Park',
            autoLoad: true,
            proxy: {
                type: 'jsonp',
                url: 'http://192.168.1.103/androidserv/PublicAppServ.asmx/ListNearInfo',
                reader:{
                    type: 'json',
                    rootProperty: 'data'
                },
                extraParams: {
                    userId: 'll',
                    lng: '123',
                    lat: '39',
                    key: 'abc123'
                },
                callbackKey: 'callback'
            },
            sorters: [{ property: 'Range', direction: 'ASC'}]
        }
    });

    其中重要的是url的写法,.asmx后增加webservice的方法名,传给webservice的参数使用extraParams配置项。另外callbackKey一定要加上,值可设置为默认的callback。

    webservice的写法

    using System;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Script.Serialization;
    using System.Web.Script.Services;
    
    namespace MobileServ
    {
        /// <summary>
        /// PublicAppServ 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
        [System.Web.Script.Services.ScriptService]
        public class PublicAppServ : System.Web.Services.WebService
        {
    
            #region 服务
            
            [WebMethod(Description = "获得测试数据的列表")]
            public void ListNearInfo(string userId, string lng, string lat, string key)
            {
                HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
                string jsonCallBackFunName = "callback";
                if (HttpContext.Current.Request.Params["callback"]!=null)
                    jsonCallBackFunName = HttpContext.Current.Request.Params["callback"].ToString();
                string result = string.Empty;
                if (key == ConfigurationManager.AppSettings["WSKey"])
                {
                    List<ParkInfo> lisPark = GetData();
                    result = "{success: true,data:[";
                    for (int i = 0; i < lisPark.Count; i++)
                    {
                        result += "{";
                        result += "Name:'" + lisPark[i].Name + "'";
                        result += ",Address:'" + lisPark[i].Address + "'";
                        result += ",Range:" + lisPark[i].Range;
                        result += ",Price:" + lisPark[i].Price;
                        result += ",Count:" + lisPark[i].Count.ToString();
                        result += "}";
                        if (i < lisPark.Count - 1)
                            result += ",";
                    }
                    result += "]}";
                }
                HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, new JavaScriptSerializer().Serialize(result)));
                
            }
    
            private List<ParkInfo> GetData()
            {
                List<ParkInfo> lisPark = new List<ParkInfo>();
                ParkInfo pinfo1 = new ParkInfo();
                pinfo1.Name = "测试路1";
                pinfo1.Address = "测试地址1";
                pinfo1.Range = "2.5";
                pinfo1.Price = "5";
                pinfo1.Count = "83";
                lisPark.Add(pinfo1);
                ParkInfo pinfo2 = new ParkInfo();
                pinfo2.Name = "测试路2";
                pinfo2.Address = "测试地址2";
                pinfo2.Range = "3.2";
                pinfo2.Price = "10";
                pinfo2.Count = "12";
                lisPark.Add(pinfo2);
                ParkInfo pinfo3 = new ParkInfo();
                pinfo3.Name = "测试路3";
                pinfo3.Address = "测试地址3";
                pinfo3.Range = "3.2";
                pinfo3.Price = "10";
                pinfo3.Count = "12";
                lisPark.Add(pinfo3);
                return lisPark;
            }
            
            #endregion 服务
        }
    }

    需要注意的是,webservice通过HttpContext.Current.Request.Params["callback"]来读取sencha touch从客户端发来的跨域请求的回调函数名callback。再把这个函数名加入到返回的json之前。实现客户端的跨域读取。

    webservice的web.config配置节system.web下一定要加上如下配置项,否则sencha touch无法读取webservice的数据。

    <webServices>
          <protocols>
            <add name="HttpPost"/>
            <add name="HttpGet"/>
          </protocols>
        </webServices>

    一切配置完成后,数据就能在view中展现出来。

  • 相关阅读:
    RadioButton练习(android)
    关于 RArrayFixFlat 与 RArray 与 CArrayPtrFlat 的测试
    How do I add an attachment to the message
    Grid View
    android 布局文件属性说明(转)
    File 存储(android)
    How to Make an HTTP Connection Using TCP/IP with RSocket
    使用RHTTPTransaction后产生CONE 36 Panic的解决办法
    SharedPreferences 存储(android)
    对话框的练习(android)
  • 原文地址:https://www.cnblogs.com/jinqi79731/p/3473257.html
Copyright © 2020-2023  润新知