以HTTP GET请求为例,说明下我们的工程中RPC中数据的传输方式。
- 把发送的数据封装到一个对象object中
- object经过序列化得到json
- json再经过base64编码,得到base64Json
- base64Json的md5值,通过私钥(SHA1withRSA签名算法),计算出签名,并进行base64编码得到sign
- base64Json经过url编码,得到urlEncodeJson;sign经过url编码得到urlEncodeSign。把urlEncodeSign和base64EncodeJson当做HTTP参数发出请求。
- 接受响应,把response报文的数据实体得到responseJson(响应的Conten-Type=application/json)
- 把responseJson经过反序列化得到jsonObject
- 从jsonObject中得到responseSign和responceMsg,利用公钥验签。
- responseMsg经过base64解码得到msgJson
- 把msgJson反序列化为dataJsonObject,开始使用里面的字段。
有一点值得注意,就是GET请求发送前,参数需要urlencode。
对于接收方而言,如果是通过url传值,一定不要进行urlDecode;如果是通过Cookie传至,则需要urlDecode。这是因为tomcat服务器会自动做一次decode。如果接收方想做decode,那么发送方需要将参数做两次encode。
今天工作中发现一个现象,HTTP请求参数是urlencode过的。如果通过浏览器get访问,服务器得到的参数是已经decode的;而通过POST请求,拿到的参数还是encode的。与前端沟通过,原因是数据在post请求的body中。
晚上回家后,使用org.apache.commons.httpclient.HttpClient做了测试,证实了前端的说法。
今天有点小感悟:每做一事,务必总结归纳出其中的套路。一个技术人的成长就是不断叠加套路的过程。
相关阅读:关于URL编码 – 阮一峰的网络日志