二:本次介绍彩信POST信息构成分析。SOAPDecode类构造与Envolope信息留至下篇吧。
首先,我们来看一个彩信包包头的示例:
包头部分:
POST /MMS/Receiver HTTP/1.1
content-type: multipart/related; boundary="--NextPart_0_6192_87016";type="text/xml";start="</tnn-200102/mm7-vasp>"
content-length: 41184
soapaction: ""
x-mms-huawei-mm7-rcptto: 10658000
cache-control: no-cache
pragma: no-cache
user-agent: Java/1.5.0_16
host: 192.168.1.10:8080
accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
connection: keep-alive
包头部分可以使用以下C#代码输出:
StringBuilder strHeader = new StringBuilder();
strHeader.AppendLine(string.Format("{0} {1} {2}",Request.HttpMethod, Request.FilePath, "HTTP/1.1")); //这个HTTP/1.1用什么办法获取,谁知道指教下?
foreach (var item in Request.Headers)
{strHeader.AppendLine(string.Format("{0}:{1}", item, Request.Headers[item.ToString()]));
}
彩信包头中,重要的是Content-Type与Content-Length这两部分。
Content-Type:multipart/related表明这次请求分多部分,boundary="--NextPart_0_6192_87016"表示各部分的分隔符是"--NextPart_0_6192_87016",start="</tnn-200102/mm7-vasp>"表示开始部分的Content-ID为"</tnn-200102/mm7-vasp>"。
Content-Length表示这次请求内容的主体长度。请求的主体可以用Request.InputStream来获取(在java中需要根据主体长度循环读取InputStream,C#中暂未实验,等实验后再更新)。
好了。彩信包头的信息就介绍到这。至于好多规范中说的可能还有MIME-Version: 1.0的字段,这个我抓包时发现移动的没传,解析中也没有用到这字段的地方,忽略吧。
下面看看彩信包主体示例:(主体较长,有41KB,除了标记,内容部分用......省略了)
----NextPart_0_6192_87016
Content-Type: text/xml;charset="UTF-8"
Content-Transfer-Encoding: 8bit
Content-ID: </tnn-200102/mm7-vasp><?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<mm7:TransactionID xmlns:mm7="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-0" env:mustUnderstand="1">0730000009740120813230806001</mm7:TransactionID>
</env:Header>
<env:Body>
<DeliverReq xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-0">
<MM7Version>6.3.0</MM7Version>
<Sender>+8613900000000</Sender>
<Recipients><To><Number>10658000</Number></To></Recipients>
<TimeStamp>2012-08-13T23:08:06+08:00</TimeStamp>
<Priority>Normal</Priority>
<Subject>转发:中国移动信息</Subject>
<MMSRelayServerID>900000</MMSRelayServerID>
<ReplyChargingID></ReplyChargingID>
<Content href="cid:defaultID"/>
</DeliverReq>
</env:Body>
</env:Envelope>
----NextPart_0_6192_87016
Content-Type:multipart/related;start="<smil-part>";type="application/smil";boundary="SubPart_1_2339_28544"
Content-ID:defaultID--SubPart_1_2339_28544
Content-Type:application/smil;name="SMIL.smil"
Content-ID:<smil-part>
Content-Location:SMIL.smil
Content-Transfer-Encoding: 8bit
......--SubPart_1_2339_28544
Content-Type:text/plain;charset="UTF-8";name="3067296.txt"
Content-ID:<2733504>
Content-Location:3067296.txt
Content-Transfer-Encoding: 8bit
......--SubPart_1_2339_28544
Content-Type:image/jpeg;name="cover.jpg"
Content-ID:<2733600>
Content-Location:cover.jpg
Content-Transfer-Encoding: 8bit
......--SubPart_1_2339_28544
Content-Type:text/plain;charset="UTF-8";name="2973696.txt"
Content-ID:<2735504>
Content-Location:2973696.txt
Content-Transfer-Encoding: 8bit
......--SubPart_1_2339_28544--
----NextPart_0_6192_87016--
彩信包中,用包头是提到的分隔符"--NextPart_0_6192_87016"做分割,可以得到两部分内容:第一部分为Content-ID为包头中start指定的,即Envelop的xml文件,第二部分为主体文件列表,又以以下部分开头:
Content-Type:multipart/related;start="<smil-part>";type="application/smil";boundary="SubPart_1_2339_28544"
Content-ID:defaultID
从这部分信息中,可以看出:接下来的第二部分内容,是以"SubPart_1_2339_28544"作分割的子内容。
再看看子内容部分:
--SubPart_1_2339_28544
Content-Type:text/plain;charset="UTF-8";name="2973696.txt"
Content-ID:<2735504>
Content-Location:2973696.txt
Content-Transfer-Encoding: 8bit......
子内容部分又分为信息头与主体部分,以两个\r\n\r\n分割。说明了此部分文件类型、文件名、ID、编码方式等信息。
今天先到这吧。接下来的事情就是将这些各部分文件分割,得到具体文件内容,并解析Envelop信息。