adideas/infinity_scroll_php

大型对象传输控制协议

dev-master 2023-08-10 10:33 UTC

This package is auto-updated.

Last update: 2024-09-10 13:03:44 UTC


README

摘要

大型对象传输控制协议 (LOTCP) 是客户端和服务器之间的一种独立于语言的同步通信格式。

本文件确立了一个应用间互操作性的通用标准,是互操作性的主要指南(功能兼容性)。

本文件的状态

本文件定义了LOTCP跟踪协议。

本文件的制定受到以下标准的发展的影响

  • RFC 7159 (JSON)

本备忘录的分发有限制(仅限内部使用)。

版权声明

MIT 许可证

版权(c)2023 Aleksei Vlasov, Vlad Saliy。

在此特此授予任何获得此软件及其相关文档文件(以下简称“软件”)副本的人,免费使用该软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论此类责任基于合同、侵权或其他法律行为,源于、因之或与此类软件或软件的使用或其他方式有关。

目录

  1. 引言 1.1 需求 1.2 术语 1.3 总体操作
  2. 命名约定和类型命名约定 2.1 命名约定 2.2 类型命名约定
  3. 协议参数 3.1 请求 3.2 响应 3.3 过滤器 3.4 页面 3.5 头部 3.6 元数据 3.7 选择 3.8 同步

1. 引言

1.1 需求

本文档中使用的关键词“必须”、“不得”、“需要”、“应”、“不应”、“应该”、“不应该”、“推荐”、“可能”和“可选”的解释请参考 RFC 2119

如果一个实现未能满足其实现的协议中一个或多个 必须要求 级别的需求,则该实现不合规。如果一个实现满足其协议中所有 必须要求 级别和所有 建议 级别的需求,则称其为“无条件合规”;如果一个实现满足其协议中所有 必须 级别的需求,但不是所有 建议 级别的需求,则称其为“有条件合规”。

1.2 术语

  • 请求 - 尝试从服务器获取数据。
  • 响应 - 从服务器获取数据。
  • 客户端 - 用于发送请求而建立连接的程序。
  • 服务器 - 通过发送响应来处理请求的应用程序程序。任何给定的程序都可以既是客户端也是服务器。

1.3 总体操作

LOTCP 协议是一种请求/响应协议。客户端通过任何通信通道以 JSON 格式向服务器发送请求。服务器以带有同步标签的 JSON 响应客户端。

请求建立在 JSON 之上,并在 请求 中定义了必要的参数。

服务器 可以 忽略请求参数。服务器 必须 发送新的请求参数。客户端 必须 根据服务器的要求更改请求参数。

响应建立在 JSON 之上,并在 响应 中定义了 必须 的参数。

2. 命名规范和类型命名规范

2.1 命名规范

  • 负载 - 传输数据。
  • 头 - 数据的附加参数;传输数据的属性/描述。
  • 元数据 - 客户端和服务器同步的通信数据。
  • countItems - 元素的数量。
  • identifyKey - 识别键的名称。
  • totalItems - 服务器上存在的元素数量。对象的大小。
  • page - 关于页面或需要获取的页面的信息。
  • hasNext - 信息表示对象尚未完全接收。
  • nextIdentify - 关于客户端和服务器同步的信息。
  • totalPages - 已存在页面的数量。
  • currentPage - 当前页面。
  • nextPage - 下一页。
  • prevPage - 上一页。
  • to - 所需元素的数量。
  • filter - 关于过滤对象元素的信息。
  • select - 对象处理。构建对象映射。
  • name - 操作/函数/对象的名称。
  • value - 依赖于上下文。值或相关数据。

2.2 类型命名规范

boolean - 布尔 - bool

true 字节: 01110100 01110010 01110101 01100101
十六进制: 74 72 75 65

string - 字符串 - String

ABC 123 字节: 01000001 01000010 01000011 00100000 00110001 00110010 00110011 十六进制: 41 42 43 20 31 32 33

number - 整数 - int

1 字节: 00110001 十六进制: 31

array - 数组 - 数据集合。

  int[2] = {1, 2, 3}; // C++ or Java
  [1,2,3]; // JavaScript or PHP

JSON | XML | BASE 64

JSON - RFC 8259. XML - RFC 5364. BASE 64 - RFC 4648。

3. 协议参数

3.1 请求

如果您需要获取不带数据参数 [to = -1] 的配置。

// Request object
{
   "identifyKey": "uuid",
   "to": 25,
   "filter": [
      {
         "name": "SORT",
         "identifyKey": "date",
         "value": "ASC"
      },
      {
         "name": "BETWEEN",
         "identifyKey": "date",
         "value": "[\"1970-01-01\",\"1970-12-31\"]"
      }
   ],
   "page": 1,
   "nextIdentify": "Ub7AZUwxNu...",
   "select": ["uuid", "name", "date"]
}

3.2 响应

// Response object
{
   "payload": [
      {"uuid": "Ub7AZUwxNu..."},
      {"uuid": "AZNuUb7AZU..."}
   ],
   "header": {
      "countItems": 2,
      "identifyKey": "uuid"
   },
   "meta": {
      "totalItems": 100,
      "page":{
         "totalPages": 4,
         "currentPage": 1,
         "nextPage": 2,
         "prevPage": 0
      },
      "hasNext": true,
      "nextIdentify": "NuUbUwxNu..."
   }
}

3.3 过滤器

过滤器旨在过滤数据(排序)。服务器可能由于过滤器的缺失或由于传递给过滤器的数据不正确而忽略过滤器。过滤器的基本参数列表。它们的 presence 是强制性的。

描述对象的基线参数。

示例 JSON

// Filter object
{
   "name": "SORT",
   "identifyKey": "date",
   "value": "ASC"
}

3.4 页面

页面描述了页面(如书籍页面)的行为逻辑。

此对象依赖于[to, page]请求的参数关于请求。如果这些参数缺失,则当前对象不会出现在服务器响应中。

描述对象的基线参数。

示例 JSON

// Page object
{
   "totalPages": 4,
   "currentPage": 1,
   "nextPage": 2,
   "prevPage": 0
}

3.5 头部

头部描述了有效负载中的数据。

描述对象的基线参数。

示例 JSON

// Header object
{
   "countItems": 2,
   "identifyKey": "uuid"
}

3.6 元数据

元数据对象用于客户端和服务器之间的协调或通信。此对象对于客户端理解如何获取其他信息是必要的。

描述对象的基线参数。

示例 JSON

// Meta object
{
   "totalItems": 100,
   "page":{
      "totalPages": 4,
      "currentPage": 1,
      "nextPage": 2,
      "prevPage": 0
   },
   "hasNext": true,
   "nextIdentify": "NuUbUwxNu..."
}

3.7 选择

选择用于处理对象。使用此对象,您可以指定客户端期望的对象。

示例 JSON

// Select object
["uuid", "name", "date"]

3.8 同步

此协议支持客户端和服务器之间的同步。同步在每个时钟周期(请求/响应)发生。对于提前同步,客户端可以请求零时钟周期。使用[to = 0]将不会得到结果。因为0将被视为配置缺失。要得到结果,请使用[to = -1]

如果您需要获取不带数据参数 [to = -1] 的配置。

示例请求

// Request object
{
   "identifyKey": "",
   "to": -1
}

示例响应

// Response object
{
   "payload": [],
   "header": {
      "countItems": 0,
      "identifyKey": "uuid"
   },
   "meta": {
      "totalItems": 100,
      "hasNext": true,
      "nextIdentify": "NuUbUwxNu..."
   }
}