http 如何 response byte 数据

2019-05-07 12:33:07 +08:00
 imherer

原数据( json ):{"id":1010,"na":"zhangsan"}

转成 byte:[xxx xx xxx xx xx ...]

现在想直接通过 http 的方式将 byte send 出去,好像不行啊? 用 golang 和 node.js 分别试了下,最后 send 出去的文件打开之后就直接变成了原 json 串了

付代码:

go

s := `{"id":1010,"na":"zhangsan"}`
data := []byte(s)
w.Write(data)

node

let b = new Buffer(`{"id":1010,"na":"zhangsan"}`)
response.send(b)
2834 次点击
所在节点    程序员
18 条回复
deepdark
2019-05-07 12:44:33 +08:00
从你的表述中已经成功实现了,因为已经作为文件打开了。所以你的目的到底是啥,以及为什么要把 json 转成 byte 再返回?
binux
2019-05-07 12:45:56 +08:00
作为人类,我都搞不清楚你想要干什么。你还指望机器能搞清楚?
imherer
2019-05-07 12:49:19 +08:00
@deepdark
@binux
其实是项目中用了 protobuf,我看 protobuf 最后就是转成了 byte,我想把 protobuf 格式化后的结果发给客户端
hearfish
2019-05-07 12:54:04 +08:00
Content-Type: application/octet-stream
3dwelcome
2019-05-07 12:55:14 +08:00
protobuf 没 http 头部消息,要完全去掉感觉有点难度。
单纯发 http 的二进制答复应该是可以的,图片都是二进制数据流。
imherer
2019-05-07 12:57:21 +08:00
@hearfish 这个试过了。 最后得到的结果还是 json 串
imherer
2019-05-07 13:09:12 +08:00
@3dwelcome 嗯。好像 http 默认把二进制解析了
msg := &test.Msg{
id: 1,
na: "zhangsan"
}

data, _ := proto.Marshal(msg)

w.Write(data)

最后客户端收到的结果是:{"id":1010,"na":"zhangsan"}
hearfish
2019-05-07 13:09:51 +08:00
@imherer 你例子发的不就是 json 串么,string 转 bytes 但是内容没变啊。。发一个 protobuf 试试看
choury
2019-05-07 13:12:17 +08:00
你打印的时候用 byte 打印就是 byte 了
nfroot
2019-05-07 18:29:55 +08:00
楼主是想把字符都转为 16 进制,对吧
imherer
2019-05-07 19:38:44 +08:00
@nfroot 可能我的方向错了
我想实现的有两方面:
1.能不能把数据压缩一下,在 json 的基础上看能不能怎么压缩下,尽量省流量
2.降低可读性,json 比 byte 的可读性强太多了
iceheart
2019-05-07 19:54:26 +08:00
你想要的是 gzip ?
imherer
2019-05-07 20:15:37 +08:00
@iceheart 嗯,这个我知道。 我是想在代码里还有没有别的方法能不能把 json 给压缩
nfroot
2019-05-07 21:25:19 +08:00
@imherer 楼主,问问题的时候想的是什么问的就是什么,别自己胡乱创造名词又不说出自己想要的内容,你看看楼都歪成什么样了。

开 gzip 就行了,它就会压缩了,传输的时候会压缩!!!!但是你要可读性降低,那就找一种 js 和你后端匹配的压缩算法,每次两边读写的时候都压缩和解压,

你再发一个主题,你直接就说你的后端语言是什么,传输过程中要压缩内容,前端用户看到的是压缩后的最好是二进制那种,一定要说清楚你会不会写代码,否则白搭,如果你不会写代码,也是白搭。
KuroNekoFan
2019-05-07 23:30:32 +08:00
yxn1910
2019-05-08 09:48:22 +08:00
你应该是没有序列化再返回,上面的写法是直接返回 json 字符串。
如果是用 Protobuf 需要把 Protobuf 对象先序列化再返回,
譬如 PHP 的官方库是 $protobufObject->serializeToString()
Golang 中是 proto.Marshal(protobufObject)
Node 中是 protobufObject.serializeBinary();
imherer
2019-05-08 10:16:50 +08:00
@nfroot 谢谢善意的提醒
imherer
2019-05-08 10:17:51 +08:00
@yxn1910 看我 7 楼的回复,序列化之后还是同样的结果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX