新普金娱乐网址


地理《枪炮、病菌和坚强》

中医基本守则01:物心不次

OGC之路(1) 之 WMS标准上总结

  • 九月 13, 2018
  • 地理
  • 没有评论
  1. 为还好之读,我们要安装GeoServer,当然网上为产生过多WMS服务而供应访问。建议把返回的XML文本放到浏览器还是支持收缩的XML编辑器中有益浏览。

    先期打一个例证开始,启动GeoServer,打开浏览器,在地点栏敲入如下连接:http://localhost:8080/geoserver/wms?bbox=-130,24,-66,50&styles=population&Format=image/png&request=GetMap&layers=topp:states&width=550&height=250&srs=EPSG:4326,你会相浏览器显示的美国行政区划图(由此美国丁之知势力可见一斑,不管愿意不愿意,你时常都见面看到他俩的国旗,地图,总统还闹总统夫人)。关于地方连接的切实可行意思,我们见面当下面介绍。

    再次敲入第二单连续:http://localhost:8080/geoserver/wms?service=WMS&request=GetCapabilities,浏览器会回到提示打开或保存一个文书,我的机械返回的是一个叫“wms”的文书,没有扩大名。没关系我们把它保存也“wms.xml”就可了。然后用浏览器打开,会看是单相当可怜之文书,具体内容也会当脚说。

    此地用针对WMS的调用连接做一个大概介绍,首先我们不能不报服务器我们怀念采取WMS服务,因为服务器又可能还提供了不少旁OGC服务,于是我们设置参数service=WMS。然后我们要报服务器我们纪念使调用GetCapabilities方法,于是我们安参数request=GetCapabilities。每个方法也许还有方法的参数,这个就算当介绍道时再说了。到此我们就完全的施用了一个WMS服务器的不过要害职能,很简单吧。WMS之所以强大,正是由它的粗略。“简单就美”是成套计划的主旨。

  2. GetCapabilities,如果你想采取一个WMS服务器,那尔应该长调用这个方式。

    调用:http://localhost:8080/geoserver/ows?service=WMS&request=GetCapabilities,这个法子返回服务器的力。一般会是一个不行要命的XML文档,关于此文档标准有充分详细的讲述,这里就做一个提纲式的介绍。

    将这文档去头去尾以后留下两独节点Service和Capability。
    Service包含了有关服务器的相似特性数据,对于只是想直接使用WMS服务器的总人口吧,这个节点还无顶用得达,唯一值得注意的尽管是KeywordList节点,它其中是重点字,也就是服务器的保留字。
    Capability才是咱上学的基本点。如果您想对的应用WMS服务器,这个节点内的情节就必搞明白了。你得自者节点获得如下信。

    1)服务器支持什么措施,WMS服务器必须支持GetCapabilities和GetMap,此外还有很多扩大的法门,例如:DescribeLayer以及支持SLD服务器的超常规措施,由于GeoServer不是SLD服务器,这里吧尽管从未有过办法打听了。

    2)服务器支持什么返回格式,WMS返回的地形图还是渲染好的图,因此此的格式基本上还是图片格式(还是来差不过未以此处介绍了),如:image/png。

    3)服务器发布了怎样图层,这个是WMS的重要性,不然你并最简便易行的GetMap调用都组织不下。

    下我们就算来上学怎么样获取这些多少。首先进行Capability节点,可以观看Request和Layer两单节点,此外尚会见有Exception和UserDefinedSymbolization,不过当下本着我们所以处不死。Request节点包含服务器支持之方式,我此归是如此几独节点:GetCapabilities,GetMap,GetFeatureInfo,DescribeLayer和GetLegendGraphic(注意老版的WMS返在此间归的节点名称会无均等,可能会见失去丢“Get”,我们这边介绍的凡1.1.1本的)。我们才介绍GetCapabilities和GetMap。

    先期来说说GetCapabilities节点。你也许会说“GetCapabilities”,不纵是咱们在谈论的办法为,是的便是这艺术,你不能不调用了这个方式才会知道有关她的风味,很有拧吧
    :)。在是节点内你得看出Format和DCPType节点,前者指出函数返回内容之格式,其实就算是咱正讨论的XML,后者暂时未讨论。

    GetMap节点的情一律为是Format和DCPType节点,这里的Format列有了服务器支持回到的地图格式。

    WMS返回的图层是嵌套的形式,根节点就是我们将说及之Layer节点。它其中除了自身的性状外尚见面含有其他Layer。先来说说Layer自身的特点。先得说明一下,由于Layer存在父子关系,所以她们之特色也即存在继续关系,子节点支持父节点的表征,而父节点比肯定支持子节点的特征。与具象世界一样,“老子的饶是儿子的,儿子的未必是老子的”。

    Layer最要紧之特点即是Name,在伸手方法GetMap的Layers参数中援引的哪怕是者价,关于GetMap方法的细节后介绍。然后次主要之特征节点分别是SRS,LatLonBoundingBox,BoundingBox和Style,这些都是起在GetMap方法中之参数。

    消证实的是,根结点的Layer没有Name,因为这Layer只是一个封装,它其中的“瓤”才是咱们感谢兴趣之。而服务器支持的SRS(地理坐标系统)也会以此来单总汇。这将是一个十分丰富的清单。LatLonBoundingBox是经纬度表示的图层范围,依次是minx,miny,maxx,maxy。例如:<LatLonBoundingBox
    minx=”-180.0″ miny=”-90.0″ maxx=”180.0″ maxy=”90.0″ />。
    BoundingBox是图层默认坐标系表示的限与LatLonBoundingBox格式一样独自是多了一个SRS属性,例如:<BoundingBox
    SRS=”EPSG:26713″ minx=”588926.6865343997″ miny=”4913890.332215005″
    maxx=”609271.2114429093″ maxy=”4927102.448786693″
    />。Style节点很关键,他表示图层支持之渲染样式,就是画风。一个图层可以支撑多独Style。Style的子节点最着重之虽是Name,我们见面在GetMap方法的参数Styles中之所以到。到之结束,Layer节点就介绍了了。

  3. GetMap,如果您想使用一个WMS服务器,那若必会频频调用这个艺术。调用:http://localhost:8080/geoserver/wms?request=GetMap&bbox=-130,24,-66,50&srs=EPSG:4326&layers=topp:states&styles=population&Format=image/png&width=550&height=250。

    俺们出必不可少详细说明一下调用参数。前面都介绍过service和request了,这里集中在GetMap自己之参数上。如果你若调用GetMap方法,无疑使设置request=GetMap。随后我们要报服务器我们要见到哪位范围外之地形图,于是我们装bbox=-130,24,-66,50,这个bbox使用了EPSG:4326盖标系,于是我们安srs=EPSG:4326。

    俺们说过,服务器发布了广大图层,我们得指明我们怀念看的图层,于是我们设置layers=topp:states,注意layers可以设置多个图层,用“,”隔开,图层的渲染顺序就是参数设置的顺序。我们得采用默认的体制来渲染图层,于是设置styles=,也可指定渲染样式,于是设置styles=population。对诺layers的设置顺序,styles也足以装多只样式,用“,”隔开。我们期望回到的图形是png格式的,于是设置Format=image/png。最后,我们要报告服务器,返回的图纸的大大小小,width=550&height=250,以像素为单位。

    及此结束我们介绍了了WMS的调用,其实还有许多情,想只要深刻学习的朋友可错过OGC的网站下充斥完整的文本,PDF格式的。找有早已实现的开源WMS客户端通过代码学习。当然,最得力的学途径就是自己实现一个WMS客户端。下面我们就算来促成一个C#版本的WMS浏览器。

  4. WmsBrowser需求

    1、用户输入WMS服务器的URI,点击一个按钮调用GetCapabilities方法。然后用返回的数量初始化控制界面。
    用户以支配界面上得翻服务器的各种Capability数据,并且可以择而展示的图层,调整图层顺序
    ,为图层设置参数,然后回到一个地形图图片显示在预览区。

    2、用户可以管返回的图保存成文件。

    就闹那么些支持WMS的客户端了,有成千上万代码可供应就学与利用。但是,为了不打搅视线,为了避免介绍多余的情节,为了体现“自主创新精神”,最重大之凡为了体验编程的野趣(这吗是本人那儿上者行当之缘故),我操仅行使NotNet标准库提供的类似完全从头开始编写代码。

  5. WmsBrowser设计

    依据需求,这是一个WinForm的施行顺序。需求实际上很不强烈,完全没有说明最根本之一些,控制界面,是啊体统的,用户如何运用它。所以发生必不可少补偿一下了。

    控制界面有零星个力量:

    1)查看GetCapabilities返回的多少;

    2)设置GetMap需要之调用参数。

    咱们得据此来规划这界面。GetCapabilities返回的多寡我们面前都介绍过了,想象一下咱就款软件之潜在用户可能想使见到什么样数据,他们见面如何用这些多少。首先得是服务器发布的图层,这是造访WMS的绝无仅有因。至于服务器支持什么调用应该无是她们关心的,而是我们开发者关心的。所以我们需要在界面及出示出Layer的情,由于Layer是嵌套的,自然而然我们得一个培育控件。

    除此之外Layer的Name,Title,Abstract。这些属于性外,用户应还亟需掌握Layer支持的SRS,Style,Format和BoundingBox。这样他们才会组织出合理之调用参数。我们肯定不应有吃用户查看了数据后手动构造调用参数,我们用为用户很有益之所以鼠标完成工作。我们就明白要一个培育控件来显示Layer信息。然后我们得提供组织调用参数的界面。首先我们考虑用户可能会见怎么样就这个工作。

    面的牵线中我们直接是手动敲入字符串来成功调用URI的构建的,繁琐而便于失误,但是这种艺术十分灵巧,所以当保留。于是我们用一个TexBox来输入URI。然后我们需要一个按钮来发出GetMap请求。我们不能不考虑到,有相当一些总人口并无擅键盘操作(其中包括自我),所以我们当给他俩提供鼠标操作模式。于是第二个界面出现了,用户以此以鼠标选择想使显示的Layer,调整Layer显示的逐一,选择每个Layer的Style,选择Format,选择SRS,输入BoundingBox,输入返回图片的尺寸。然后同点击上面提到的按钮,发出GetMap请求。更进一步,我们可以为此者的界面来得到一个中坚的调用参数,然后至TextBox里面去微调,这样用户会得重新好之灵活性。

    好了,到此处我们大多整明白控制界面的师了。现在亟需讨论某些统筹风格方面的问题。我们好把具备代码写上一个吃MainForm的类里,它是一个WinForm类。这样没错,完全好干活,实际上我表现了的大部代码都是这般干得。这样做的结果是,我飞即见面放弃这个路,转而去浏览cnblog或ifeng上面的帖子。我们要一个再好的宏图。我们以此并无是如果讨论架构,模式与开发方法,所以我们仅需要上一个共识就得了:我们需要将界面元素,操作响应与数据模型分开编码,为他们单独成立类似系。

    仍这我们的规划为尽管基本上了,开始编码咯。

  6. WmsBrowser编码ing。。。

  7. 先后完成。

    代码下载

    起先程序后会看见主界面如下:图片 1下图是回去的地图

    图片 2 

    这个序还坏稚嫩,有那么些问题没考虑,例如:输入验证,数据印证,异常处理等。以后咱们见面日渐全面它,目前作一个参照和上学WMS的起点就足足了。

  8. 后续

    当动用这顺序时,作为用户,我觉得还有好多未便于之地方。

    率先,我只要敲错了地方,我十分容易敲错,程序会弹来一个猥琐之怪对话框,显示平挺堆堆积如山栈信息,完全看不闹是呀错。

    从,设置参数BBox很不便利,如果能够打都部分地图上之所以鼠标选择就好了。

    再有,返回时只是显示一个图片想看细节又如果重复设置,Apply,GetMap的操作,太繁琐了。

    如上就是是自个儿当做用户指向当时款软件的理念,看来我们得改进。我们会在此后的议论着逐年健全这顺序。

发出一段时间没有就微信的主题继续介绍中的功能模块了,这段日子来,微信也召开了很多之转移改动,针对这些特色我到审核了瞬间有关的微信公众号及商店号的接口,对原始的微信API和系统管理做了到家的翻新,本随笔和后的随笔就是因这工作达的总,以期将微信涉及的功能模块,都使用C#落实的点子来介绍。本随笔主要介绍微信公众号的个性化菜单的实现,虽然目前微信公众号与店号已经当功能及看似一致,不过当店堂号上还并未个性化菜单的连锁接口。

任何还源于一年差不多先,记得是512下的快,老板于海外找来同样家专门提供地图业务的合作社。他们本来使用ArcGIS作为服务平台,但是后来考虑到每年昂贵的劳动用,决定将作业将到中华来,结果就是找到我们。其实我们连GIS应用之开销经历都未曾,不知道老板怎么说之(不愧是老板娘,要是自己只好老老实实说没有开过愿意学)把这在用到了手。我得简单介绍下我们若开的事务。我们得保护一套C#的代码(甲方在沿海先找找了下商店开发的,然而要由维护费用问题而将代码交给我们)。这套代码实话说,基本考虑是正确的,可惜没有坚持到底,结果到处都是复制修改的始末。OO的中心标准它几乎都坏了了了,可以说凡是反面教材的规范。但是它的关于GIS的支出是天经地义的,而且竟然还是因OGC的概括对象看协议进行的宏图。我之几有GIS启蒙就是针对性就套代码的明。也尽管是在这里首先不行相了OGC。经过同年焦头烂额的保障之后,我逐渐深入到GIS的组成部分平底领域,同时项目组来了新娘子,我之年华呢不怕方便了。于是我起来潜心学习OGC的各种正规,首先是通读,了解OGC的系统布局。然后确定了WMS,WFS,WCS,SLD,Filter,GML为首要学习目标。之所以写在只密密麻麻文章,主要是为交流,同时为为投机之学留下记录。此地让出OGC的连日。

3、个性化菜单封装接口的动

产生矣地方接口的包装,我们得以创建个性化菜单的下大便宜了,构建个性化菜单的时候,我们用将所有亟需出现的食谱都亟待在一个conditionalmenu的单元中,虽然这么的单元在聚集里面出现多单。

如下面是构建一个个性化的菜系种类,和普通的默认菜单不同,它需指定一个matchrule的对象,如下代码所示。

            MenuJson conditional = new MenuJson("相关链接", new MenuJson[] { 
                new MenuJson("个性化菜单", ButtonType.click, "event_company")
            });
            MatchRule rule = new MatchRule()
            {
                sex = "1"
            };

            MenuListJson menuJson = new MenuListJson();
            menuJson.button.AddRange(new MenuJson[] { conditional });
            menuJson.matchrule = rule;

经过地方的代码了解,我们只要欲加多单个性化菜单,那么即便是由此此方式,每次创建一个个性化菜单的章程开展构建,当然如果我们利用查询个性化菜单的结果可以见到,如果创建多个,那么conditionalmenu集合里面凡是大抵只目标的。

调用代码每次添加一个个性化菜单的操作如下所示。

                string menuid = menuBLL.CreateConditionalMenu(token, menuJson);
                Console.WriteLine("创建菜单:" + (!string.IsNullOrEmpty(menuid) ? "成功:" + menuid : "失败"));

咱们创建多个规则后,可以由此TryMatch的法门来检查匹配的结果,也便是对准诺不同用户(openid)会并发不同之个性化菜单列表了。

                    var myResult = menuBLL.TryMatchConditionalMenu(token, openId);
                    if (myResult != null)
                    {
                        Console.WriteLine(myResult.ToJson());
                    }

                    var userid_female = "oSiLnt2J4mYkhVG3aLTdMIF1hv-s";//女性的ID
                    myResult = menuBLL.TryMatchConditionalMenu(token, userid_female);
                    if (myResult != null)
                    {
                        Console.WriteLine(myResult.ToJson());
                    }

 

一旦对这《C#支付微信门户及用》系列感兴趣,可以关心我的另外文章,系列随笔如下所示:

C#开微信门户及采取(28)–微信“摇一摇·周边”功能的动以及接口的实现

C#开发微信门户及运用(27)-公众号模板消息管理 

C#支付微信门户及动(26)-公众号微信资料管理

C#付出微信门户及使用(25)-微信企业号的客户端管住效果

C#开微信门户及运用(24)-微信小店货架信息保管

C#付出微信门户及动(23)-微信小店商品管理接口的包装和测试

C#开微信门户及使用(22)-微信小店的支出同动

C#付出微信门户及运用(21)-微信企业号的信及波之接处理同解密 

C#支付微信门户及下(20)-微信企业号的食谱管理

C#出微信门户及利用(19)-微信企业号的音信发送(文本、图片、文件、语音、视频、图文信息等)

C#开发微信门户及下(18)-微信企业号的通讯录管理出的成员管理

C#支出微信门户及利用(17)-微信企业号的通讯录管理支付的部门管理

C#开微信门户及以(16)-微信企业号的配备与用

C#付出微信门户及使用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

 C#支出微信门户及用(14)-在微信菜单中采取重定向得到用户数量

C#开微信门户及采取(13)-使用地理位置扩展相关以

C#支出微信门户及利用(12)-使用语音处理

C#出微信门户及用(11)–微信菜单的多种展现方法介绍

C#支出微信门户及采取(10)–在保管体系中同步微信用户分组信息

C#开微信门户及利用(9)-微信门户菜单管理以及交至微信服务器

C#付出微信门户及以(8)-微信门户应用管理网功能介绍

C#开微信门户及采取(7)-微信多客服功能和支付并

C#支出微信门户及利用(6)–微信门户菜单的管理操作

C#出微信门户及以(5)–用户分组信息保管

C#支出微信门户及下(4)–关注用户列表及详细信息管理

C#出微信门户及应用(3)–文本信息以及图文信息的回应

C#支出微信门户及用(2)–微信消息的拍卖以及应

C#出微信门户及下(1)–开始动微信接口

2、个性化菜单的C#设计处理

微信的菜谱是微信处理中酷关键之平等绕,因为它们是微信叫用户输入体验重要之一模一样围绕,也是非常直观的界面呈现之一,菜单的显示就是待我们绞尽脑汁来简单的界面元素了,由于菜单的首要和效能的丰富性,我于前头好几首随笔专门介绍了菜单的各种处理。

在《C#付出微信门户及运用(6)–微信门户菜单的管住操作》、《C#开微信门户及动(9)-微信门户菜单管理及交至微信服务器》、《C#付出微信门户及使用(11)–微信菜单的又呈现方法介绍》、《C#支付微信门户及运用(20)-微信企业号的食谱管理》分别针对相关的菜单来过介绍,有亟待好参见了解一下。

食谱模块,在微信公众号与公司号,它们还可以协同用一个型,因此我们把这些内容都放在微信联手用模块里面,包括她的实业类信息(如菜单模块),虽然有些地方,部分字段内容尚未,但是我们可由此实体类的JSON标识来进行拍卖,从而实现比较弹性化的实业类消息承载。

一般来说标识代码所示。

    /// <summary>
    /// 菜单基本信息(公众号、企业号公用,其他部分一样)
    /// </summary>
    public class MenuJson : BaseJsonResult
    {
        /// <summary>
        /// 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
        /// </summary>
        public string name { get; set; }

        /// <summary>
        /// 按钮类型(click或view)
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string type { get; set; }

        /// <summary>
        /// 按钮KEY值,用于消息接口(event类型)推送,不超过128字节
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string key { get; set; }

        /// <summary>
        /// 网页链接,用户点击按钮可打开链接,不超过256字节
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string url { get; set; }

        /// <summary>
        /// media_id类型和view_limited类型必须,调用新增永久素材接口返回的合法media_id
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string media_id { get; set; }

        /// <summary>
        /// 子按钮数组,按钮个数应为2~5个
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public List<MenuJson> sub_button { get; set; }

上面这实体类是菜单信息之基本功信息,我们需要从者基础及扩张出来几独实体类,方便在构建,获取菜单信息之时刻进行信息转换,如下几只类图的宏图所示。

图片 3

经过就几乎只类似的涉,我们便好适应所有的默认菜单与个性化菜单,以及商店号的菜谱信息易处理了,通过JSON转换为对应之实体类,实现信息的强类型处理。

内部我们菜单处理的API实现类代码如下所示。

    /// <summary>
    /// 菜单的相关操作
    /// </summary>
    public class MenuApi : IMenuApi

诸如此类我们于IMenuApi的底蕴及加码几独个性化的接口。

        /// <summary>
        /// 创建个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuJson">菜单对象</param>
        /// <returns></returns>
        string CreateConditionalMenu(string accessToken, MenuListJson menuJson);

        /// <summary>
        /// 根据菜单ID删除个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuid">菜单ID</param>
        /// <returns></returns>
        CommonResult DeleteConditionalMenu(string accessToken, string menuid);

        /// <summary>
        /// 测试个性化菜单匹配结果
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <returns></returns>
        MenuListJson TryMatchConditionalMenu(string accessToken, string user_id);

下一场在MenuApi实现类似中实现相关的逻辑处理即可。

下是创立个性化菜单的接口说明。

1、个性化菜单介绍

俺们先行了解一下个性化菜单的介绍,根据官方的资料,如下介绍。

以协助公众号实现灵活的业务运营,微信公众平台新增了只性化菜单接口,开发者可以由此该接口,让群众号的不同用户群体看到不相同的自定义菜单。该接口开放为业已证实订阅号和就说明服务号。

开发者可以经过以下规则来设置用户观看的菜单:

1、用户分组(开发者的业务需求可以借助用户分组来完成)
2、性别
3、手机操作系统
4、地区(用户在微信客户端设置的地区)
5、语言(用户在微信客户端设置的语言)

个性化菜单接口说明:

1、个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Android 6.2.4以上。
2、菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
3、普通公众号的个性化菜单的新增接口每日限制次数为2000次,删除接口也是2000次,测试个性化菜单匹配结果接口为20000次
4、出于安全考虑,一个公众号的所有个性化菜单,最多只能设置为跳转到3个域名下的链接
5、创建个性化菜单之前必须先创建默认菜单(默认菜单是指使用普通自定义菜单创建接口创建的菜单)。如果删除默认菜单,个性化菜单也会全部删除

个性化菜单匹配规则说明:

当公众号创建多个个性化菜单时,将按照发布顺序,由新到旧逐一匹配,直到用户信息与matchrule相符合。如果全部个性化菜单都没有匹配成功,则返回默认菜单。
例如公众号先后发布了默认菜单,个性化菜单1,个性化菜单2,个性化菜单3。那么当用户进入公众号页面时,将从个性化菜单3开始匹配,如果个性化菜单3匹配成功,则直接返回个性化菜单3,否则继续尝试匹配个性化菜单2,直到成功匹配到一个菜单。
根据上述匹配规则,为了避免菜单生效时间的混淆,决定不予提供个性化菜单编辑API,开发者需要更新菜单时,需将完整配置重新发布一轮。

除开正常的默认菜单外,个性化菜单提供了下几乎只处理操作。

1 创建个性化菜单

2 删除个性化菜单

3 测试个性化菜单匹配结果

4 查询个性化菜单

5 删除所有菜单

个性化自定义菜单功能,是依公司可以依据粉丝的分组、性别、手机操作系统,甚至地区,来分别显示公众号的菜单。

据,一下健身会所的公众号,将起定义菜单根据粉丝性别进行了离别设置。男性粉丝进入公众号会展示男生等于感兴趣菜单内容,跆拳道、搏击等;若是女粉丝,则会显示瑜伽、舞蹈、防身术等女性粉丝感兴趣的食谱课程等。

图片 4

 

创建个性化菜单

http请求方式:POST(请用https协议)

https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN

吁示例

{
    "button":[
    {   
        "type":"click",
        "name":"今日歌曲",
        "key":"V1001_TODAY_MUSIC" 
    },
    { 
        "name":"菜单",
        "sub_button":[
        {   
            "type":"view",
            "name":"搜索",
            "url":"http://www.soso.com/"
        },
        {
            "type":"view",
            "name":"视频",
            "url":"http://v.qq.com/"
        },
        {
            "type":"click",
            "name":"赞一下我们",
            "key":"V1001_GOOD"
        }]
 }],
"matchrule":{
  "group_id":"2",
  "sex":"1",
  "country":"中国",
  "province":"广东",
  "city":"广州",
  "client_platform_type":"2"
  "language":"zh_CN"
  }
}

中间点的信息,转换为我们的实体类对象信息就是之类所示。

MenuListJson menuJson

她API返回结果如下所示。

{
    "menuid":"208379533"
}

为了承载这个信息,我们需要定义一个实体类来承载这个消息。

    /// <summary>
    /// 返回MenuId的结果
    /// </summary>
    public class MenuIdResult
    {       
        /// <summary>
        /// 菜单的ID
        /// </summary>
        public string menuid { get; set; }
    }

最后咱们的API接口就需要得到里面的菜谱ID值,字符串类型的饶可以了,API具体实现代码如下所示。

        /// <summary>
        /// 创建个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuJson">菜单对象</param>
        /// <returns></returns>
        public string CreateConditionalMenu(string accessToken, MenuListJson menuJson)
        {
            string result = "";
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token={0}", accessToken);
            //matchrule不能为空
            ArgumentValidation.CheckForNullReference(menuJson.matchrule, "matchrule");

            string postData = menuJson.ToJson();
            MenuIdResult list = JsonHelper<MenuIdResult>.ConvertJson(url, postData);
            if (list != null)
            {
                result = list.menuid;
            }
            return result;
        }

设若去个性化菜单的接口也是类似的拍卖,如下所示。

        /// <summary>
        /// 根据菜单ID删除个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuid">菜单ID</param>
        /// <returns></returns>
        public CommonResult DeleteConditionalMenu(string accessToken, string menuid)
        {
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token={0}", accessToken);
            var data = new
            {
                menuid = menuid
            };

            string postData = data.ToJson();
            return Helper.GetExecuteResult(url, postData);
        }

除此以外,对于个性化菜单来说,查询、删除所有的菜单操作接口及通常默认菜单是相同的,因此得以选用这点儿独接口,不过由于我们扩张了询问返回的信息类,所以一旦是个性化菜单,那么其回到的JSON字符串里面,包含了conditionalmenu的习性,这个是一个集合
,也就是说个性化菜单是大抵独规则的个性化菜单的集纳。

图片 5

食谱的JSON数据结构如下所示。

图片 6

 

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图