在消息服务采用json格式作为头信息格式文章中,我设计了头信息的一些必要字段。本文定义消息整体而非仅仅是头部的设计规范。
消息分为请求、信息、文件和提示。其中信息和文件属于实体信息,实体信息是具备消息内容的信息,传输消息内容而非程序指令是实体信息的目的。请求属于指令信息,它们的目的是辅助程序完成逻辑而非为用户传输信息。提示则是计算机软件发送给用户的信息,例如发送成功的状态信息、错误信息。
除了指令信息,其他的信息都应当有内容,也就是说内容长度大于0。指令信息的指令和参数通过头信息传输即可。
指令消息的一般格式
以登录请求为例,头信息要包含消息类型和参数:
{
"message-type":"request",
"request":"login",
"user-name":"myname",
"password":"mypsw"
}
指令消息的参数尽可能直接包含在头信息当中而非json数据的子对象中。
实体消息的一般格式
实体消息分为一般消息和大数据包消息。一般消息代表了实体消息的一般格式,大数据包消息本身也遵循尸体消息的格式,不过需要额外的指令消息辅助解决大数据消息的阻塞问题。
一般消息格式
一般消息可能是文字消息,因为文字消息通常不会太大,也可能是小的图像,例如表情符号,或者极小的文件,例如一份纯文本文件。
对于文字消息,消息内容应该以utf-8编码紧接着消息头,无需采用json或xml等格式存储。如果想要借助xml等方式创建富文本内容,则应在消息头中标记内容类型。
下面以简单的文本消息为例展示消息内容:
{
"message-type":"message",
"content-type":"text/plain",
"content-length":6
}Hello!
其中Hello!是消息内容,它紧接着代表头部json数据结束的},没有换行或者其他任何间隔。
如果像下边这样,}符号后边有换行符,那么换行将被视作消息的一部分,这可能导致消息展示的时候前边出现不希望的空行:
{
"message-type":"message",
"content-type":"text/plain",
"content-length":7
}
Hello!
大数据包消息
大数据包消息本身格式与一般消息无异,消息内容以二进制字节流发送而不是文本,在内容类型中应标明big:
{
"message-type":"message",
"content-type":"big/image",
"content-length":232346
}010101000101010101010010101010101010010...
对于文件等不作为消息直接展示给用户的内容应当在消息类型中表明附件:
{
"message-type":"attachment",
"file-name":"pink sunset.jpg",
"content-type":"big/image",
"content-length":232346
}010101000101010101010010101010101010010...
提示信息
提示信息可能包含结构化设计,其消息体可能为json或者xml等格式:
{
"message-type":"error",
"content-type":"text/json",
"content-length":68
}
{
"caused-by":"network-faild",
"message":"Please try again later"
}