热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SOE中三个重要概念:Schema、Resource、Operation。

前面几节我们介绍了SOE基本概念、RESTSOE模板以及如何处理输入输出数据。今天详细介绍一下SOE中三个重要概念:Schema、Resource、Operation。1.SchemaSOE中的R

前面几节我们介绍了SOE基本概念、REST SOE模板以及如何处理输入输出数据。今天详细介绍一下SOE中三个重要概念:Schema、Resource、Operation。

1.Schema

  SOE中的Resource和Operation所组成的结构就是Schema,也可以说Shcema确定了SOE中Resource和Operation的层次结构。通常由IRESTRequestHandler接口的GetSchema()方法来返回该SOE的Schema,作为一个JSON格式的字符串被返回。在REST API中可以通过讲一个http请求的参数设置为“f=schema”来获取Schema。

  下面我们来看几个Schema的例子

    Schema1 只有一个Operation

{
  "operations" : [ "buffer", "near" ]
}
  在该例子中,SOE之暴露了一个Operation,从REST API角度来讲,这个SOE之暴露了两个URL。SOE跟资源和Buffer Operation:
http://<service-url>/exts/<extensionName> //root SOE resource
http://<service-url>/exts/<extensionName>/buffer //buffer operation

    Schema2 有多个Operation

{
  "operations" : [ "buffer", "near" ]
}

  在该Schema中Operation是一个数组,所以可以指定多个操作。从REST API角度来讲,这个SOE暴露了三个URL、SOE跟资源、Buffer和near操做:

http://<service-url>/exts/<extensionName> //root SOE resource
http://<service-url>/exts/<extensionName>/buffer //buffer operation
http://<service-url>/exts/<extensionName>/near //near operation

    Schema3 具有参数的Operation和它指定的参数以及输出格式

{
  "operations" : [
    {
      "name" : "buffer", 
      "parameters" : ["location", "distance"], 
      "supportedOutputFormats" : ["json", "amf"]
    },
    {
      "name" : "near", 
      "parameters" : ["location", "distance", "lookingFor"], 
      "supportedOutputFormats" : ["json"]
    }
  ]
}

它同Schema2暴露的URL是一样的,区别在于它不仅制定了Operation的名称,还有一些Operation的附属信息,稍后我们会继续讨论这种Schema。
  Schema 4 子Resource
{ "name" : "MyMapServiceExtension", "operations" : ["export", "identify"], "resources" : [ { "name" : "metadata" }, { "name" : "layers", "isCollection" : true, "operations" : ["query"], "resources" : [ { "name" : "features", "isCollection" : true } ] } ] }
  该Schema中除了Operation外,还指定了它的子Resource。该SOE包含两个根级Operation:export和identify,同时也包含了两个子资源: metadata和layers。
metadata资源可以通过以下URL获得:
http://<service-url>/exts/<extensionName>/metadata

  注意到layers是一个Collection Resource(集合资源,因为其isCollection属性为true),可以通过以下URL访问它的子图层资源:

http://<service-url>/exts/<extensionName>/layers/<layerId>

  同时,每一个图层都支持query操作,如下URL:

http://<service-url>/exts/<extensionName>/layers/<layerId>/query

  每一个图层中又包含了features子资源。features也是一个集合资源,每个特定的feature可以通过以下URL访问:

http://<service-url>/exts/<extensionName>/layers/<layerId>/features/<featureId>

2.Resource

  所有的SOE服务最少支持一个根级的Resource和Operation,如果Schema指定的话也可以包含子资源。

  REST handler经常会从SOE中获取一个resource的json表达。如果客户端使用“f=json”开请求一个resource,SOE将会以json格式发送到客户端。另一方面,如果使用Services Directory显示的话,通常会将json转换为html形式显示在网页上。

  现在假定通过SOE返回的json格式的根资源如下:

{
  "description: "Contitental US",
  "extent" : { "xmin" : ..., "ymin" : ..., ...},
  "spatialReference" : {...},
  ...
  
  "layers" : [
    { "id" : 0, "name" : "Cities", ... },
    { "id" : 1, "name" : "Counties", ... },
    { "id" : 2, "name" : "States", ... }
  ]
  
  ...
}

  当其在Services Directory中显示时,Rest handler会发现一个“layers”属性,由于他在Schema中被指定作为Collection Resource,将会首先检查这个属性(layers)的值是否是一个json数组,进一步检查每个元素是否是一个具有id和name属性的json对象。这样将会用他的name作为显示而将id放在放在URL连接中。点击Cities时会获得如下URL:

http://<service-url>/exts/<extensionName>/layers/0 //the Cities layer

在Services Directory中如下显示:

  使用REST API获取一个SOE的resource,实际上是触发了SOE中的handleRESTRequest方法。对于resource请求,该方法的OpeartionName参数将是一个空字符串,而resourceName参数是一个跟SOE的resource相关的字符串。下图展示了在Schema4中对于不同的resource的REST请求,将被转换成handleRequest触发时的resourceName参数:

3.Operation

  如果SOE的Schema中指定了某些resource支持Operation,该resource的Services Directory页面将会显示出Operation的链接。如:

  在Schema2中之定义了一个Operation的名字,并没有参数和返回格式信息,这时Services Directory通常会显示一个form,用户需要在此提供参数信息和值,在Schema中的buffer Operation将会如下显示:

  类似resource,用REST API发送Operation请求时也触发了HandleRESTRequest方法。这时候operationName将是一个非空字符串,resourceName将是一个与SOE的resource有关联的字符串。在Schema4中,发送不同的Operation请求,将被转换成handleRESTRequest触发时的resourceName和operationName:

  REST客户端会把operation参数作为query parameter放在URL中。在handleRESTRequest出发之前,REST handle将输入参数强制转换成json对象,参数名作为json对象的属性名,参数值作为有意义的json对象值,如数字、bool、json对象、json数组,如果不能转换成上述类型则转换为字符串。handleRESTRequest中的outformat参数设置为“f”指定的类型。

http://<service-url>/exts/<extensionName>/near?
location={x: -117.05, y: 34.11}&distance=2.5&&lookingFor=ATM&f=json

上述请求中,location参数将会被转换成json对象,distance被转换成数字,lookingFor将被转换成string。在触发handleRESTRequest方法之前,operationInput参数将被转换成如下json对象:

{
  "location" : {x: -117.05, y: 34.11}, //JSON object
  "distance" : 2.5, //number
  "lookingFor" : "ATM" //string
}

以上就是这节要说的内容,特别声明一下,本篇内容并非原创,大部分内容参考了这篇文章:

http://atlas.resources.ca.gov/arcgis/SDK/REST/extension.html

 
 
标签: ArcServer, SOE
推荐阅读
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文探讨了在UC浏览器中调用分享面板后,图片无法正常显示的问题,并提供了详细的解决方法和代码示例。 ... [详细]
author-avatar
mobiledu2502884897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有