赞
踩
作者:禅与计算机程序设计艺术
近年来,随着云计算、大数据、物联网等技术的飞速发展,越来越多的人开始关注数字化转型。在这种转型过程中,企业需要掌握自身的信息资产及其价值,进行信息数据的收集整理、分析和应用。但是由于各种限制和禁忌,包括对数据的保密性和安全要求、对数据获取方式的限制等,导致很多企业无法轻易地获取到数据。
为了解决这个问题,云服务商提供的API(Application Programming Interface)逐渐成为越来越多公司获取数据的主要途径。企业可以通过注册并申请API接口,来获取到数据。无论是公司内部系统间的数据交流还是外部合作伙伴之间的数据交流,都可以使用API进行数据交换。由于API接口的普及和简单易用,大大降低了企业的开发难度,使得企业可以快速开发出功能完备的产品或服务。但同时也引入了一系列新的复杂性问题——API接口的稳定性和可用性。很多企业担心API接口的稳定性会影响他们的业务,导致损失惨重。因此,对于API数据的安全性和可用性提出了更高的要求。
因此,如何在API和JSON下实现高效、可靠的数据交换成为了一个重要的问题。目前已经出现了一些成熟的标准和规范,比如RESTful API,OpenAPI等,它们将API接口的设计模式、交互协议等制订的更加严格、更加统一,更具可读性和一致性。因此,本文将围绕这些标准和规范,介绍JSON格式和API协议的配套使用的最佳实践,以及如何通过HTTP协议实现高效的传输数据。最后,还将阐述一些API安全相关的典型问题,并给出相应的解决方案。希望能够通过本文,帮助读者了解当前关于API数据的安全和可用性方面的热门话题,更好地保障自己的信息资产及其价值的保护。
REST(Representational State Transfer)是一种基于Web的、分布式的、可伸缩的、层次化的、轻量级的、松耦合的架构风格。它主要用于客户端-服务器的通信,涉及以下几个要素:
http://api.example.com/users
。基于RESTful API的设计,HTTP协议提供了请求、响应、状态等功能,在保证性能、可伸缩性、可扩展性、简洁性的同时,还满足了API的需求,在此基础上提供了丰富的规范和工具支撑。
OpenAPI(开放API),是一个描述API的规范和定义文件。该规范建立在RESTful API之上,提供了一种语言集,用来定义API的接口和相关的配置参数。通过OpenAPI,可以将API的描述文档以静态或者动态的方式发布出来,供其他人员使用,如:开发者、测试人员、运维人员等。这样就可以让更多的人参与到API的设计、实现、维护等流程中来,从而降低沟通成本、提升协同效率。
JSON,是一种轻量级的数据交换格式,可以方便的表示结构化的数据。它主要的特点有三点:
除了JSON格式外,还有一些其他的格式也可以用于数据交换,如XML、YAML等。但是,JSON还是占据主流地位,并且随着JSON的普及和广泛应用,逐渐形成了新的编程语言和框架,如JavaScript、Python等。
数据交换的过程一般分为两个阶段:
数据准备阶段:由发送方(client)根据需求生成请求报文,然后把请求报文发送至接收方(server)。请求报文通常包含数据请求的类型、请求的资源地址、授权凭证、数据格式、数据等。例如,用户A向服务器B发送查询购物车的请求,请求报文可能包含:购物车ID、授权凭证、数据格式等。
数据交换阶段:当接收方(server)接收到请求报文时,会对请求做出响应,产生响应报文。响应报文会包含数据的内容、状态码等信息。例如,服务器B返回用户A的购物车列表数据,响应报文可能包含:购物车内商品的详细信息、状态码等。
在数据交换过程中,要遵守一些基本原则:
JSON格式和API协议的配套使用可以极大的提高数据交换的效率和准确性,并保障数据的安全性。下面我们分别讨论。
API的URL地址一定要有明确的命名规范,这样可以让用户更容易记忆和识别。推荐的命名规范如下:
shoppingCart
,getUserInfo
,buyGoods
。v1.0
、v2.0
。user
,product
,order
。list
,create
,delete
,update
。UC1
,UC2
。URL的格式如下所示:
https://www.example.com/{version}/{category}/{resource}/operation?query={value}
其中:
version
:API的版本号,如:v1.0
。category
:资源分类,如:user
。resource
:资源名称,如:account
。operation
:操作类型,如:get
。query
:可选的查询条件,如:id=123
。API的参数规范分为三个级别:
URL Query Parameters:将URL的查询条件作为参数传递,这种方式在URL上更直观,但是参数数量不能超过某个阈值。例如,分页的起始页码和每页显示记录数可以在URL上直接指定:
https://www.example.com/items?page=1&size=10
Request Body:将参数放在请求报文的body中,这种方式可以将多个参数进行组合,更灵活。例如,创建一个新订单需要传入商品ID、数量、地址等信息,可以在请求报文的Body中进行传递:
{
"itemId": "ABC",
"quantity": 10,
"address": "123 Main St"
}
Path Variables:将参数放在URL路径中,类似于变量代入公式的意义。这种方式不仅可以将参数以key-value的形式传递,还可以对参数进行验证,提高API的安全性。例如,获取用户信息的API的URL可能如下所示:
/users/{userId}?fields=name,email
{userId}
:对应用户的ID。fields
:可选字段过滤条件,只能选择name
和email
这两项。API的请求头主要用于身份认证、限速、指标统计等。其中身份认证可以采用Token、OAuth2、JWT等机制,限速可以通过设置超时时间和并发量进行控制,指标统计可以通过收集各个API的访问情况和响应时间进行统计和监控。下面列举一些常见的请求头和描述:
application/json
,text/xml
。Bearer xxx
,Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
。no-cache
。60
。59
。1372700873
。API的返回值规范分为四个级别:
API的错误处理需要遵循一些基本的原则,包括:
API的测试通常需要考虑性能、冗余、可靠性等方面因素,并需要对API的健壮性和容错能力进行测试。下面是一些常见的测试指标:
JSON是一种轻量级的数据交换格式,其优点在于易于阅读、易于解析、易于机器解析、紧凑的编码格式。因此,当客户端和服务器端进行数据交换时,可以使用JSON格式进行数据序列化和反序列化。
JSON序列化指的是将对象转换为JSON格式的字符串。JSON反序列化指的是将JSON格式的字符串转换为对象。Java、C++、JavaScript等主流语言都提供了内置的JSON序列化和反序列化库,例如Jackson、Gson、fastjson等。
对象的序列化可以将复杂的对象转化为字节数组或字符串。其中,JSON序列化和XML序列化的区别在于,JSON序列化只支持JSON数据类型,而XML序列化支持多种数据类型。
有时候,对象中某些属性的值不能直接转换为JSON格式,需要对其进行特殊的处理,比如日期格式的处理。此时,可以自定义序列化器,对这些属性值进行序列化。
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
Instant instant = value.toInstant(ZoneOffset.UTC);
long epochSecond = instant.getEpochSecond();
int nanoOfSecond = instant.getNano();
gen.writeNumber(epochSecond * 1000 + nanoOfSecond / 1_000_000);
}
}
objectMapper.registerModule(new JavaTimeModule());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.configure(SerializationFeature.WRITE_DATES_WITH_ZONE_ID, true);
objectMapper.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")));
objectMapper.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
JSON Patch是一种基于JSON的格式,它定义了一种PATCH方法,用于修改JSON对象。在使用RESTful API更新资源时,可以使用JSON Patch的方式来实现部分更新。
例如,有一个接口用于修改用户信息:
PATCH /users/:id
{
"age": 30
}
使用JSON Patch的方法来实现相同的功能:
PATCH /users/:id
[
{ "op": "replace", "path": "/age", "value": 30 }
]
JSON Patch的操作符有:
本章首先介绍了数据的转型需求和目前常用的技术手段。然后重点介绍了基于API和JSON的数据交换的基本原理、安全性和可用性方面存在的问题。接着详细讨论了API协议和JSON格式的配套使用时的最佳实践,以及API安全的典型问题和对应的解决方法。最后给出了一个参考建议,即“API数据交换的两种标准:RESTful API和OpenAPI”。阅读本文,读者应该能够较好的理解API数据交换中的各种问题,并掌握在实际生产环境中应对这些问题的思路和方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。