使用JSON作为API请求的有效负载时出现的各种常见问题

JVAX (JSON Verification and Conversion/Transformation) 系统可在云服务接收到传入请求之前对所有传入请求进行处理。JVAX 旨在处理使用 JSON 作为 API 请求的有效负载时出现的各种">常见问题。

本文提出了一种解决方案,该解决方案处理云服务与其用户需要进行 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 字段类型

支持的类型 输入值 示例 string java.lang.String 支持的双引号字符串值。 "type" : "string" boolean true 或 false "type" : "boolean" object 一个有序的键/值对集合。

properties 指示符保存了这些键/值对的描述。 "type" : "object","properties" : {// description of the collection} array 一个有序的值序列(该值可以是基本类型或其他对象类型)。

假设这些元素具有相同类型。

items 指示符保存了该阵列的描述。 "type" :"array","items" : {// description of array elements} number java.lang.number 支持的数值 "type" : "number"

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

表 2. JVAX 类别及其相关处理规则

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

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

JVAX 设计

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

图 1. JVAX 概述

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

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

设计 JSON 模式

定义 JSON 模式的步骤包括:

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

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

图 2. 设计一个 JSON 模式的步骤

JVAX 加载流程

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

图 3. JVAX 加载流程

在图 3 中展示的流程中:

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

配置选项

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

JVAX 的优势

JVAX 解决方案的优势包括:

易于配置:基于规则的 JVAX 方法使得利用可能时常变化的业务规则变得很容易。 可插拔性和可扩展性:基于规则的 JVAX 方法可嵌入在实际服务或其他任何现有服务代理中。或者在有效负载被拦截或者审查时,作为独立的代理进行添加。 易于维护:只需改变配置,无需重新部署服务。 高效性:请求不能到达 API,除非这些请求是有效的。因此,这将为服务供应商减少不必要的处理开销。 版本控制支持:尽管系统内部界面可能会被服务供应商改变 ,但 JVAX 提供一种较为简单的方法来维护外部界面兼容性。 文档支持:模式信息可直接转化成 API 文档。

结束语

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

时间: 2024-11-12 07:35:17

使用JSON作为API请求的有效负载时出现的各种常见问题的相关文章

Solr查询语言 JSON Request API

一.背景与动机 JSON Request API是由noggit作者(同时也Solr Committer Leader)在Solr.5.3带来新特性,意在改善Solr原来复杂且又丑陋查询语法. 注:JSON Request API与Solr API v2并不是一回来,JSON Request API是一种新型Solr Query DSL.API v2新版本查询API,是基于Restful API实现的.当然JSON Request API显然是基于JSON实现的咯. 不过Request API还

java-在请求网络数据时,如何写比较好?

问题描述 在请求网络数据时,如何写比较好? 1.有大量的请求查询.输入的数据不一样,后的的结果不同(JSON) 2.有什么好的结构吗? 3.求指导 解决方案 大量的数据,这个不要主观臆测,什么叫大量,大量的数据在网络带宽还是数据解析还是内存上遇到瓶颈?不同的问题处理的对策不同.

如何设计一个作为基于JSON的API公开的整合流程

第 2 部分展示了如何构建一个整合流程(orchestration),该整合流程可调用 http://www.aliyun.com/zixun/aggregation/14536.html">Salesforce.com 公开的基于 JSON 的 REST API 来创建一个账户.第 3 部分展示如何设计一个作为基于 JSON 的 API 公开的整合流程. WebSphere Cast Iron(后面简称为 Cast Iron)被广泛用于遍及内部和外部应用程序的集成和迁移.过去,JSON

加密-API请求 所有参数按照字段名的ascii码从小到大排序后

问题描述 API请求 所有参数按照字段名的ascii码从小到大排序后 URL:http://api.pcaexpress.com.au/tracking 请求类型:POST 请求参数: 参数 类型 api_id 字符串 必填 test 字符串 data 字符串 必填 sign 字符串 必填 除sign字段外,所有参数按照字段名的ascii码从小到大排序后使用keyvalue的格式(即key1value1key2=value2-)拼接而成,空值不传递,在拼接完的字符串前后俩段都加上API KEY密

[求助]仅当显式请求注释处理时才接受类名称

问题描述 大家好,初学java,遇到这个问题...Win7系统jdk安装路径为:D:ProgramFilesJavajdk1.7.0_04系统变量为:JAVA_HOME=D:ProgramFilesJavajdk1.7.0_04Path=.;%JAVA_HOME%bin;CLASSPATH=.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar然后输入以下代码:publicclassHello{publicstaticvoidmain(String[

json对象转为字符串,当做参数传递时加密解密的实现方法_javascript技巧

[son对象  字符串 互相转行] 比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex":"男","age":"24"}; var b='{"name":"Mike","sex":"女","age":"29"

POST请求,iOS开发时,图片上传的时候,类型是文件流,怎么写

问题描述 POST请求,iOS开发时,图片上传的时候,类型是文件流,怎么写 POST请求,iOS开发时,图片上传的时候,类型是文件流,怎么写,在线等 解决方案 http://blog.csdn.net/zhangkongzhongyun/article/details/8277426 解决方案二: 给个思路就行,或者给个链接

我的JAVAC命令运行后不能编译成class文件,并说错误,仅当显示请求注释处理时才接受类名称hello.java

问题描述 我在设置环境变量,在docs中运行java-version,显示java版本信息,网上强人说这表示环境设置已经成功,然后我按照网上教程,在cmd运行E:NOTEPADHELLO.JAVA在E盘目录下穿件文件hello.java.hello.java文件内编码为:/*简单的HelloWorld程序*/publicclassHello{//main方法publicstaticvoidmain(Stringargs[]){System.out.println("HelloWorld!&quo

请求facebook授权时,返回错误

在请求facebook授权时,返回如下错误:所提供的网址不被应用程序配置所接纳.:应用程序的设置不允许一个或多个所提供的链接.它必须与网站的URL或Canvas的URL相符,或该域必须是应用程序的一个域的子域. 解决:Facebook应用控制面板中"设置>高级"有" Valid OAuth redirect URIs"设置项,这里填写的地址要与程序中设置的授权返回页一致.