动态验证和转换基于云的应用程序的 JSON 有效负载

常见术语

  • JSON:一个为传送结构化数据而设计的基于文本的开放标准。JSON 是在 Web 应用程序和 Web 服务器之间传输数据的常用格式。
  • JSON 有效负载:针对 REST API 的 POSTPUT 请求的格式化 JSON 主体。
  • JSON 模式:介绍应用于 JSON 有效负载的验证和转化规则。


本文提出了一种解决方案,该解决方案处理云服务与其用户需要进行 JavaScript Object Notation (JSON) 有效负载验证和转换时出现的问题。我们将这种基础架构称为 JVAX(JSON Verification and Conversion/Transformation,JSON 验证和转换),它使用了一个可配置的 JSON 模式来实现验证和转换。

带有 JSON 有效负载的云应用程序的开发周期通常涉及连续的升级和集成。每个用例的添加或修改都有可能需要更改应用程序的 JSON 验证和转换逻辑。这使得应用程序越来越脆弱,容易出错,并且难以维护。

一般来说,提供 Representational State Transfer (REST) API 的云服务会执行大量 JSON 有效负载验证和转换工作。JVAX 基础架构被设计用于独立验证和转换云服务的 JSON 工作负载,因此,JVAX 系统减少了请求-验证流程的工作量,该流程通常是服务提供商必须完成的。与此同时,JVAX 还有助于使得使用应用程序变得更可靠,并且应用程序更易于维护。

JVAX 使用一个复杂的机制来描述有效负载规则。在介绍 JVAX 结构之前,我们先来查看一个示例。

JVAX 模式定义

清单 1 展示了一个简单 JSON 有效负载:一个 Person 对象。

清单 1. Person 对象的样例输入数据
"Person": {
  "FirstName" : "Krishna",
  "LastName" : "Yadav"
  "Age" : 25,
  "PhoneNumber" : "91-012-3456789"
}

清单 2 展示了清单 1 的 Person 对象的一个基本 JSON 模式示例:

清单 2. Person 对象的 JVAX 模式定义
{
  "Person" : {
    "type" : "object",
    "properties" : {
      "FirstName" : {
        "type" : "string",
        "category" : "MANDATORY"
      },
      "LastName" : {
        "type" : "string",
        "category" : "MANDATORY"
      },
      "Age" : {
        "type" : "number",
        "category" : "MANDATORY"
      },
      "PhoneNumber" : {
        "type" : "string",
        "category" : "OPTIONAL"
      }
    }
  }}

清单 2 中的 JSON 模式描述了 Person 对象的各种各样的数据类型。表 1 列出了 JVAX 支持的类型:

表 1. 支持的 JVAX 字段类型
支持的类型输入值示例
stringjava.lang.String 支持的双引号字符串值。
"type" : "string"
booleantruefalse
"type" : 
"boolean"
object一个有序的键/值对集合。
properties 指示符保存了这些键/值对的描述。
"type" : "object",
"properties" : {
// description of the collection
}
array一个有序的值序列(该值可以是基本类型或其他对象类型)。
假设这些元素具有相同类型。
items 指示符保存了该阵列的描述。
"type" 

:"array","items" : {
// description of array elements
}
numberjava.lang.number 支持的数值
"type" : 
"number"

在有效负载中,每个字段都需要一个值。对于每个字段来说,该模式应用了一个 category。这些类别使用内部规则(在应用程序代码的业务逻辑中实现)确定了 JVAX 如何处理字段值。这些规则支持一种重写这些值的方法,这对于防止调用方设置无效值来说非常重要。表 1 展示了 JAVX 类别及其相关处理规则:

表 2. JVAX 类别及其相关处理规则
类别描述(针对 API 用户)内部处理规则(yes = 输入中提供)(no = 输入中不提供)
MANDATORYAPI 请求必须提供该值。
  • 如果是 yes,则使用该值。
  • 如果是 no,则会出现错误。
OPTIONALAPI 请求可有选择地提供该值,如果没有提供任何值,则使用默认值。
  • 如果是 yes,则使用该值。
  • 如果是 no,而且在该模式中提供了一个默认值,则使用该默认值。
  • 如果是 no,而且该模式中没有提供默认值,则不执行任何操作。
RESERVED该字段仅供内部专用。所有 API 输入值都将被忽略,并使用该模式中的内部默认值进行替换。
  • 如果是 yes,则使用默认值覆盖。
  • 如果是 no,则创键一个默认值并填充。
(这两种情况下都不会出现错误。)
SUPPRESSED如果提供值,则忽略该值。
  • 如果是 yes,则删除该值。
  • 如果是 no,则不执行任何操作。

该模式也支持使用枚举类型、规则表达式和自定义验证机制。因为模式可参考共享对象定义, JVAX 可提升代码重用率。


JVAX 设计

JVAX 设计中的关键概念是,在服务供应商处理这些请求之前,通过一个 JVAX 系统传递这些请求。图 1 展示了一个 JVAX 组件以及如何关联它们的概述:

图 1. JVAX 概述
JVAX 组件以及如何关联它们的概述

图 1 中反映的基本步骤包括:

  1. 在 JVAX 系统上,服务提供商定义了一个充当 API 有效负载模板的 JSON 模式。
  2. 用户使用该 API 将 JSON 有效负载发送给 JVAX 系统。
  3. JVAX 根据该模式验证和转换输入有效负载。
  4. 出现错误时,JVAX 代表供应商来响应用户。
  5. 验证成功时,JVAX 将请求重定向到该服务供应商。

设计 JSON 模式

定义 JSON 模式的步骤包括:

  1. 服务供应商定义了 API 和相关的有效负载字段。
  2. 服务供应商定义了反映 API 有效负载字段的模式。
  3. 服务供应商使用以下规则定义了字段类型:
    • 如果 API 需要一个字段,那么服务供应商会则将它标记为 MANDATORY
    • 如果不需要一个字段,则将它标记为 OPTIONAL
    • 总是有一组特定值的字段被标记为 RESERVED
    • 如果某个字段的值不能传递给 API,则将该字段标记为 SUPPRESSED

图 2 显示了 JSON 模式设计所涉及的所有步骤:

图 2. 设计一个 JSON 模式的步骤
图 2 中的步骤包括:1. 创建一个 JSON 有效负载模式。2. 检查 API 调用和 JSON 有效负载。3. 识别字段类别(比如必需的、有选择、的保留或禁止的)。4. 识别字段数值类型和自定义验证。5. 确定针对未识别的 JSON 结构的策略

JVAX 加载流程

图 3 展示了一个 JVAX 系统的启用流程:

图 3. JVAX 加载流程
JVAX 系统加载流程的图像

在图 3 中展示的流程中:

  1. JVAX 系统读取服务用户提供的 JSON 有效负载。
  2. JVAX 读取服务供应商为特定 API 提供的 JSON 模式。
  3. JVAX 尝试验证 JSON 模式。如果遇到错误,则返回一个错误条件并停止。
  4. 如果模式是无效的,那么 JVAX 将会根据已定义的 JSON 模式来验证 JSON 有效负载。如果有效负载与 JSON 模式的签名不符,则会返回一个错误条件并停止。
  5. 如果有效负载验证过程中没有出现错误,那么 JVAX 将会(有选择地)根据 API 需要转化输入 JSON 有效负载。
  6. 服务供应商基础框架将会调用该 API,并使用它来向服务用户发送响应。

配置选项

对于整体 JVAX 系统,既可以进行单机配置,也可以进行嵌入式配置。在单机配置中,JVAX 从云服务中单独安装,作为一个单独的流程运行。在嵌入式配置中,JVAX 嵌入在现有应用程序中,因此可共享同一个进程空间。嵌入式配置使得 JVAX 易于部署和配置;还避免了不必要的硬件配置成本。


JVAX 的优势

JVAX 解决方案的优势包括:


结束语

JSON 被广泛用于客户端应用和 Web 服务器之间的数据传送,在云时代,进行 JSON 验证和转换变得日益重要。对于服务提供商和服务用户来说,JAVX 系统可能是一个布尔值,其可配置性可帮助服务供应商减少处理各种 JSON 格式的工作负载时所涉及的维护工作。服务用户很容易看到来自 JVAX 系统的响应,并相应地修改其 JSON 有效负载。