最近在老师这里上了WebService和Ajax,在课程中少不了要研究几个Header(Http Header & SoapHeader),在工作中正好用上。其中,关于 Http 协议的部分, 由于其使用面非常广,因此引发了很强烈的思考。
先看下面这段代码。
- public void write(String message, List<? extends Object> recipients) {
- int length = message.getBytes().length + 1;
- String httpHeader = "POST /sns HTTP/1.1\nContent-Length:" + length
- + "\n\n";
- logger.info(httpHeader + message);
- session.write(httpHeader + message);
- }
复制代码用这个write方法来组装拼凑一个Http协议的全部。
其中,1。"POST /sns HTTP/1.1"是 状态行;(明文抄打,就是这一串字符串)
2。"Content-Length:" + length (典型的‘谁变化封装谁’,length是被封装的部分,运行时二次编译之后应该是这样的形式:"Content-Length: 276"——这个数字是昨天加班到10点,看到领导们一遍又一遍测试的,所以印象深刻 ),这是著名的 Http Header。
3。message部分是 Http协议的 ‘Http Body’,如果刚巧这个部分正好是一个xml,而且这个xml又刚巧是如下这般的形式:
- <env:Envelope>
- <env:Body>
- 中间是可以传递的数据,暂时忽略
- </env:Body>
- </env:Envelope>
复制代码,则这个消息体就会被加上一个别名:Soap。当然,照猜想和推断,老师在WebService课程中巧妙运用的SoapHeader(查了相关资料,这是.net独用,java并没有对应实现)则是在上述Http Body中的Soap中再加入<env:Header></env:Header>。
上面的论述不够严谨,在W3CSchool上面查询得到格式良好的Soap应该如下:
- <?xml version="1.0"?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
- ...
- Message information goes here
- ...
- </soap:Envelope>
复制代码这样,在标准的Http与XML绑定(双剑合璧==SOAP)之后,形成的用于网络传输的格式,应该像下面这个样子(这次学乖,直接copy&paste)
- POST /InStock HTTP/1.1
- Host: [url]www.example.org[/url]
- Content-Type: application/soap+xml; charset=utf-8
- Content-Length: nnn
- <?xml version="1.0"?>
- <soap:Envelope
- xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
- soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
- <soap:Body xmlns:m="http://www.example.org/stock">
- <m:GetStockPrice>
- <m:StockName>IBM</m:StockName>
- </m:GetStockPrice>
- </soap:Body>
- </soap:Envelope>
复制代码