简介fmpdamFast message pasing Database access middleware快速数据库访问中间件协议以HTTP为基础协议建立请求和响应报文以完全不同的格式组成请求报文直接使用HTTP中表单格式和多部分表单MultipartForms格式。响应部分为自定义流式小端序协议称为fmpdam协议或fmpdam响应协议请求报文和响应报文中的字符均使用UTF8编码对于application/x-www-form-urlencoded请求用户可选择遵循RFC3986之标准对报文主体进行URL编码。下将请求部分称为fmpdam请求响应称为fmpdam响应fmpdam请求fmpdam支持报文主体为application/x-www-form-urlencoded或multipart/form-data类型的POST请求使用GET请求可得到对应接口文档。不支持除POST、GET之外的请求动词用户在提交fmpdam请求时需正确设置HTTP请求头中Content-Type首部的值为application/x-www-form-urlencoded或multipart/form-data并严格按照RFC2616、RFC3986和或RFC2388之标准组织报文主体对于application/x-www-form-urlencoded报文格式如下key1value1key2value2keyNvalueN对于multipart/form-data报文格式如下假设Content-Type首部的值为multipart/form-data;boundary----WebKitFormBoundaryOog3VnP3TtJqkpUQ------WebKitFormBoundaryOog3VnP3TtJqkpUQContent-Disposition:form-data; name Args1Value1------WebKitFormBoundaryOog3VnP3TtJqkpUQContent-Disposition:form-data; name Args2Value2------WebKitFormBoundaryOog3VnP3TtJqkpUQContent-Disposition:form-data; name KeyN;ValueN------WebKitFormBoundaryOog3VnP3TtJqkpU--上述multipart/form-data内容的16进制对照如下注意结尾的 2D 2D 0D 0A用户可选择性的对application/x-www-form-urlencoded类型主体按照RFC3986所规定的进行URL编码但由于和符分别用于分隔和识别Key、Value若Key或Value中出现或符用户必须选择对报文主体进行URL编码否则将导致报文主体无法被解析产生不可预料后果。fmpdam不支持编码的multipart/form-data实体和嵌套实体不要使用base64等对multipart/form-data实体进行编码。fmpdam响应当HTTP状态码 200 || 300 时表示响应主体中仅包含一个使用UTF8编码的错误描述字符串绝大多数时候fmpdam客户代理程序应向客户直接展示该错误描述以提示错误。也可针对HTTP状态码另作处理。当HTTP状态为200 时 fmpdam响应部分为自定义流式小端序协议并会使用HTTP Chunked对内容编码后续可能会对报文进行压缩传输客户程序不应假设fmpdam协议不使用HTTP的传输编码结构描述如下协议头部2字节标识0x80, 0xff2字节版本低字节主版本高字节次版本当前为1.22字节错误描述串长度若该值不为零表示执行语句过程中出现错误若有语句已执行则回滚。注fmpdam1.1已将此字段删除。错误描述字符串注fmpdam1.1已将此字段删除。协议正文部分记录集执行结果头部2字节语句名称串长度语句名称字符串4字节记录数量当值为0xffffffff时表示语句不返回结果集数据中不再包含后续内容注fmpdam1.2中记录数量字段的意义有变更。仅当其值为0xffffffff时表示执行的语句不返回结果集其它的任何值都是无意义的。因为在遍历记录集之前无法得知记录数量但fmpdam服务必须在发送记录集之前发送该字段如果仍必须保持此字段有效则可能导致fmpdam服务遍历记录集两次。2字节字段数量对于不返回结果集的语句响应包中将不再包含从此开始的数据字段描述部分1字节字段1类型1字节字段名称字符长度字段1名称串\01字节字段2类型1字节字段名称字符长度字段2名称串\01字节字段N类型1字节字段N名称串长度字段N名称串\0注字段名称包含零结尾客户程序在解析字段信息时可直从接收响应的缓冲区中引用该字段串以便减少资源占用。记录集部分第一条记录字段1数据字段2数据字段N数据第N条记录字段1数据字段2数据字段N数据注意除字符串和二进制外其它类型数据长度固定Bit、UCHAR为1字节SHORT为2字节LONG、FLOAT为4字节DOUBLE8字节时间戳8字节精确到毫秒的Unix timestamp。字符串和二进制数据开头4字节用于描述字节长度后随数据。字符串使用ODBC驱动设置的编码通常设置为UTF8若用户熟知如何使用fmpdam模块可自行修改否则不建议修改。该协议无完整性校验机制当利用HTTP Chunked编码的终止块作完整性校验。fmpdam响应协议结构图解2017年11月15日21时41分付浩修订fmpdam协议升级为1.1版相较1.0版响应报文中不再包含错误描述部分。语义升级为如果执行语句过程中出现错误则回滚到执行语句前的状态。2017年11月16日18时20分付浩fmpdam协议升级为1.2版相较1.1版fmpdam1.2 中记录数量字段的意义有变更。仅当其值为0xffffffff时表示执行的语句不返回结果集其它的任何值都是无意义的。因为在遍历记录集之前无法得知记录数量但fmpdam服务必须在发送记录集之前发送该字段如果仍必须保持此字段有效则可能导致fmpdam服务遍历记录集两次。2017年11月21日18时23分付浩备注fmpdam 协议以HTTP为基础协议目前尚未使用HTTP的缓存机制将来可能会用If-Modified-Since和或If-None-Match首部界时fmpdam服务可能返回HTTP的304状态。所以建议设计客户端时酌情处理If-Modified-Since和或If-None-Match首部以及304状态