protobuf实现js与java间的http通信
来源:互联网 发布:手机淘宝能微信支付吗 编辑:程序博客网 时间:2024/06/15 14:58
前端js与后端java之间的http通信我们一般采用json这种文本格式,实现非常简单,也非常容易被人抓包。protobuf协议起源于google,采用类似TLV(tag,length,value)的编码方式,输出一段字节数组,是一种二进制格式的协议。相比json格式,protobuf编码出来的内容更少,效率更高,传输过程中因为是二进制被人抓包也就更难。protobuf官方给出了很多后端语言(java,C++,python)基于protobuf的交互。前端js与后端的交互例子比较少,因为本身js在处理http请求方面也比较弱。下面提供简单demo:
proto协议文件:
message Req { required string text = 1;}message Resp { required string code = 1;}
前端代码:
<!DOCTYPE html><html><head><script src="./long.js"></script> <script src="./bytebuffer.js"></script><script src="./protobuf.js"></script><script>if (typeof dcodeIO === 'undefined' || !dcodeIO.ProtoBuf) { throw(new Error("ProtoBuf.js is not present. Please see www/index.html for manual setup instructions."));}var ProtoBuf = dcodeIO.ProtoBuf;var proto = ProtoBuf.loadProtoFile("./example.proto");var Req = proto.build("Req");var Resp = proto.build("Resp");var req = new Req();req.text="1";var body = new Uint8Array(req.toArrayBuffer());var xhr = new XMLHttpRequest();xhr.open('POST', 'http://localhost:8089/xxxxx_getProtoBufReq.action', true);xhr.responseType = 'arraybuffer';xhr.onload = function(e) {if (this.status == 200) {var resp=Resp.decode(this.response);alert(resp.code);}};xhr.send(body);</script></head><body></body></html>上面的html需要引入long.js,bytebuffer.js,protobuf.js三个文件,都可以在https://github.com/dcodeIO 的网站上找到。
参考资料:
http://mozilla.com.cn/thread-34886-1-1.html
http://web.jobbole.com/83701/
后端java代码:
public String getProtoBuf() {return "protoBuf";}public void getProtoBufReq() {HttpServletRequest request = ServletActionContext.getRequest();InputStream input=null;ByteArrayOutputStream out=null;ServletOutputStream output=null;try {input = request.getInputStream();out = new ByteArrayOutputStream();byte by[] = new byte[1024];int len = 0;while ((len = input.read(by)) != -1) {out.write(by, 0, len);}Example.Req req=Example.Req.parseFrom(out.toByteArray());System.out.println(req.getText());Example.Resp.Builder resp=Example.Resp.newBuilder();resp.setCode("300");HttpServletResponse response = ServletActionContext.getResponse();output=response.getOutputStream();output.write(resp.build().toByteArray());} catch (Exception e) {e.printStackTrace();}finally{IOUtils.closeQuietly(output);IOUtils.closeQuietly(out);IOUtils.closeQuietly(input);}}
0 0
- protobuf实现js与java间的http通信
- java与c++的protobuf网络通信
- Unity3D & Java 基于 Protobuf 通信实现
- 使用protobuf进行C#与Java通信
- 用protobuf进行C#与Java通信
- http请求使用protobuf通信
- C#与Java通过protobuf进行网络通信过程中遇到的问题
- java与js通信
- Java Applet与 JavaScript间的通信 applet js
- Android Java与JS的通信
- Js WebScoket与Java WebSocket的通信
- Java的Http通信
- 使用Zeromq和protobuf实现的socket通信
- MFC实现与手机客户端通信的http服务器
- 关于java数据通信之Google的Protobuf通信技术
- JAVA:使用 HTTP 的 Post 方式与网络交互通信
- Java与Js通信总结
- java与node.js通信
- ELK 日志归集
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
- 集合的子集
- 不得不在脑海里徘徊的站外(第三方)SEO优化策略
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
- protobuf实现js与java间的http通信
- 2.2.1 双绞线、同轴电缆、光纤与无线传输介质
- day12总结
- Java多线程系列--“JUC线程池”06之 Callable和Future
- 使用jquery操作session
- 【LightOJ 1045 Digits of Factorial】
- 欢迎使用CSDN-markdown编辑器
- maven
- 数据库事务隔离级别