arangodb erlang数据库驱动
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

8.2 KiB

Client / Server Communication (VST 1.1)

Version 1.1.0 of 23 November 2016

HTTP

使用VelocyPack作为身体。内容类型为"application/vpack"

Binary Protocol

这不是请求/响应协议。它是对称的(原则上)。消息可以来回发送,流水线,多路复用,单向或双向。
可能会生成一条消息
没有反应
只是一个回应
多重回应

该VelocyStream并没有强加或指定或要求上述行为之一。
应用程序必须在一般情况下或根据每个请求定义行为,
请参见下文。然后,服务器和客户端必须实现该行为。

Message vs. Chunk

使用者(客户端或服务器)将处理消息。一条消息包含一个或多个VelocyPack(在某些情况下是二进制数据的某些部分)。
消息中有多少VelocyPacks完全取决于应用程序,请参阅下文了解ArangoDB。

消息可能很大。由于可以通过一个连接对消息进行多路复用,因此需要将大消息拆分为多个块。
发送者/接收者类将接受一个VelocyPacks向量,将其分割成块,通过导线发送这些块,组装这些块,
生成一个VelocyPacks向量并将其传递给消费者。

Chunks

为了允许重组块,每个程序包都以一个 header 作为前缀。块始终至少为24个字节长。字节顺序始终是小端。
块的格式如下,无论它是消息中的第一个消息还是随后的消息:

名称	            类型	                描述
length	        uint32_t	        当前块(包括此标头)的总长度(以字节为单位)
chunkX	        uint32_t	        chunk / isFirstChunk(高31位/最低位),详细信息请参见下文
messageId	    uint64_t	        唯一标识符,发送方有责任生成这样的标识符(zero is reserved for not set ID)
messageLength	uint64_t	        the total size of the message.
Binary data	    binary data blob	size b1 |

声明:"chunk" and "isFirstChunk" are combined into an unsigned 32bit value.
Therefore it will be encoded as
uint32_t chunkX and extracted as

chunk = chunkX >> 1
isFirstChunk = chunkX & 0x1

对于消息的第一块,设置第二个uint32_t的低位,对于所有后续消息,将其复位。
在消息的第一个块中,数字 chunk 是消息中的块总数,在所有后续块中,数字 chunk 是该块的当前number。

数据包的总大小为(24 + b1)字节。此数字存储在length字段中。
如果需要发送大于UINT32_MAX的消息,则必须将这些消息分块。通常,最好将最大大小限制为几兆字节。

Notes:

发送(小)消息时,(出于性能原因)确保仅发送一个TCP数据包非常重要。
例如,通过在Linux下使用sendmmsg
([https://blog.cloudflare.com/how-to-receive-a-million-packets](https://blog.cloudflare.com/how-to-receive-a-million-packets/))
但是,实现者应该意识到,在TCP / IP中不能强制执行此操作,因此实现者必须始终意识到,
网络堆栈的某些部分可以拆分数据包,并且有效负载可能分成多个部分!

ArangoDB

Request / Response

对于ArangoDB客户端,请求的格式如下,该数组是VelocyPack数组:
[
    /* 0 - version: */     1,                    // [int]
    /* 1 - type: */        1,                    // [int] 1=Req, 2=Res,..
    /* 2 - database: */    "test",               // [string]
    /* 3 - requestType: */ 1,                    // [int] 0=Delete, ...
    /* 4 - request: */     "/_api/collection",   // [string\]
    /* 5 - parameter: */   { force: true },      // [[string]->[string]]   http的请求参数列表
    /* 6 - meta: */        { x-arangodb: true }  // [[string]->[string]]   http的header
]
Body (binary data)

如果数据库未设置(entry is `null`),则数据库为“ _system”。

type:

1 = Request
2 = Response (final response for this message id)
3 = Response (but at least one more response will follow)
1000 = Authentication

requestType:

0 = DELETE
1 = GET
2 = POST
3 = PUT
4 = HEAD (not used in VPP)
5 = PATCH
6 = OPTIONS (not used in VPP)

For example:

HTTP请求
    http://localhost:8529/_db/test/_admin/echo?a=1&b=2&c[]=1&c[]=3
With header::
    X-ArangoDB-Async: true
is equivalent to
    [
      1,               // version
      1,               // type
      "test",          // database
      1,               // requestType GET
      "/_admin/echo",  // request path
      {                // parameters
        a: 1,
        b: 2,
        c: [ 1, 3 ]
      },
      {                // meta
        x-arangodb-async: true
      }
    ]
    
该请求是一条以VelocyPack开头的消息。这个VelocyPack始终包含标题字段,参数和请求路径。
如果meta字段不包含内容类型,则采用默认值 "application/vpack",并且正文将是一个或多个VelocyPack对象。

The response will be

[
  1,                // 0 - version
  2 or 3,           // 1 - type
  400,              // 2 - responseCode
  { etag: "1234" }  // 3 - meta: [[str]->[str]]
]

Body (binary data)

请求可以通过管道传输或混合。使用标头中的“ messageId”映射响应。发送者有责任生成合适的“ messageId”值。

默认内容类型为"application/vpack"。

Authentication

A connection can be authenticated with the following message:
[
  1,              // version
  1000,           // type
  "plain",        // encryption
  "admin",        // user
  "plaintext",    // password
]
or
[
  1,              // version
  1000,           // type
  "jwt",          // encryption
  "abcd..."       // token
]
The response is
{ "error": false }

if successful or
{ 
  "error": true,
  "errorMessage": "MESSAGE",
  "errorCode": CODE
}

如果不成功,则在这种情况下服务器将关闭连接。可以使用/_open/auth与HTTP版本相同的语义,使用未经身份验证的开放式路由,以与HTTP相同的方式获取JWT令牌。这样,可以通过JWT在单个会话中完成完整的身份验证。

Content-Type and Accept

通常,内容类型将是VPP,即主体是存储为VelocyPack的对象。
有时有必要使用非结构化数据(例如文本,css或html)进行响应。主体将是一个仅包含二进制属性的VelocyPack对象,并将相应地设置content-type。

规则如下。

Http

Request: Content-Type
    "application/json"`: the body contains the JSON string representation
    `"application/vpack"`: the body contains a velocy pack

有一些处理程序允许JSON列表(由换行符分隔)。在这种情况下,我们还允许不使用任何分隔符的多个速度包。

Request: Accept
    "application/json":如果可能,在正文中发送JSON字符串表示形式
    "application/vpack":如果可能的话,在体内发送速度包

如果请求是"application/json"或"application/vpack"处理程序产生了其他请求(即"application/html"),那么将忽略接受。

如果请求被请求"application/json"并且处理程序产生 "application/vpack",则VPACK将转换为JSON。

如果请求被请求"application/vpack",并且处理程序生成“ application / json”,则JSON将转换为VPACK。

VPP

与HTTP相似,不同之处在于:不支持“ Accept”标头,并且"application/json"始终将其转换为“ application / vpack”。这意味着主体包含一个或多个速度包。通常,它将包含一个-值得注意的例外是导入。

如果处理程序产生了其他东西(即"application/html"),则主体将是一个二进制blob(而不是一个velocy-pack),并且将相应地设置content-type。

连接后发送的第一个字节(“客户端”端-即使程序是双向的,也有服务器在监听端口,而客户端在连接端口)

VST/1.1\r\n\r\n

(11 Bytes)