请问 spring boot 如何在 response 中同时返回一个 object 和 binary data - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Youfei
V2EX    Java

请问 spring boot 如何在 response 中同时返回一个 object 和 binary data

  •  
  •   Youfei 2019-09-16 14:55:33 +08:00 7892 次点击
    这是一个创建于 2295 天前的主题,其中的信息可能已经有所发展或是发生改变。
    菜鸟遇到了些困难,最近要要完成一个需求要求在一次响应中返回 object 和 binary data.
    目前想到 binary data 用 base64 存在 json 中,client 端是 python,拿到数据再解析
    不知道还有没有别的更好的方法,谢谢大家
    38 条回复    2019-09-18 10:41:54 +08:00
    guxingke
        1
    guxingke  
       2019-09-16 15:09:00 +08:00 via Android
    可以说没有 这种情况下 必须客户端配合解析
    oaix
        2
    oaix  
       2019-09-16 15:09:08 +08:00
    multipart
    Youfei
        3
    Youfei  
    OP
       2019-09-16 15:17:39 +08:00
    @oaix 你提到的是 multipartbody 吗,这是是个封装后的类好像需要 java 重新反射生成相应的类才能获取各个文件。https://github.com/juazugas/spring-boot-multipart
    arrow8899
        4
    arrow8899  
       2019-09-16 15:19:22 +08:00
    return {"data": object, "binary": []},binary data 序列化后其实就是一个数组;
    Youfei
        5
    Youfei  
    OP
       2019-09-16 15:20:07 +08:00
    @guxingke 没有现成的方法,只能简单粗暴一点吗?
    3789
        6
    3789  
       2019-09-16 15:22:03 +08:00 via Android
    @Youfei 你自己用的方法什么问题吗?
    Youfei
        7
    Youfei  
    OP
       2019-09-16 15:26:36 +08:00
    @3789 还没写,想着会有更优雅的实现方式或者有现成的工具~
    xfriday
        8
    xfriday  
       2019-09-16 15:45:27 +08:00
    用 protobuf 可以传 byte[]; json/xml 等都是文本序列化
    atx
        9
    atx  
       2019-09-16 15:56:50 +08:00
    第一行输出 json 字符串,然后换行输出二进制数据
    接收时 readline 第一行 json,后面当二进制处理就 ok 了,

    跟下载文件没什么区别
    xuanbg
        10
    xuanbg  
       2019-09-16 16:21:18 +08:00
    二进制数据为什么不通过另一个接口获取呢?
    Youfei
        11
    Youfei  
    OP
       2019-09-16 19:56:01 +08:00
    @xuanbg 就是这么个需求...
    Youfei
        12
    Youfei  
    OP
       2019-09-16 19:57:00 +08:00
    @xfriday 如果说,一部分是文本,而另一部分是二进制流式传输呢?
    Youfei
        13
    Youfei  
    OP
       2019-09-16 19:57:50 +08:00
    @lc1450 如果说,一部分是 json,而另一部分是二进制流式传输呢?
    LeeSeoung
        14
    LeeSeoung  
       2019-09-16 20:14:26 +08:00
    multipart/form-data 问题是 python 端的接收能自动解析出表单数据么。
    springz
        15
    springz  
       2019-09-16 20:30:57 +08:00
    一个字段放字节流,前端应该很容易转 binary,放 Hex 应该也可以
    springz
        16
    springz  
       2019-09-16 20:33:18 +08:00
    最好还是另一个接口获取
    xfriday
        17
    xfriday  
       2019-09-16 21:01:33 +08:00
    @Youfei
    message A {
    bytes b = 1;
    string c = 2;
    int32 d = 3;
    ...
    }
    hantsy
        18
    hantsy  
       2019-09-17 00:04:32 +08:00
    分开,文本用 Json,Bin 用 Stream
    Youfei
        19
    Youfei  
    OP
       2019-09-17 10:03:08 +08:00
    @hantsy 我就是在想如何在 body 中同时传输 json,bin stream,请问有实现方式吗?
    armyHcz
        20
    armyHcz  
       2019-09-17 10:11:37 +08:00
    你这个头像让我眼前一亮,又看到你问的问题,发现根本不是本人.
    Youfei
        21
    Youfei  
    OP
       2019-09-17 10:26:49 +08:00
    @armyHcz 谁,leo ?
    toxicant
        22
    toxicant  
       2019-09-17 10:39:57 +08:00
    @armyHcz Summer 吗? 我也是以为是他才进来的
    18258226728
        23
    18258226728  
       2019-09-17 11:00:39 +08:00
    感觉这个像是下载文件,然后有错误的时候不下载提示
    psyche
        24
    psyche  
       2019-09-17 11:07:17 +08:00
    可以把 JSON 也转换成二进制, 和你的 bin 合并成一个流 (比如用特殊符号分隔什么的), 然后 stream.
    Youfei
        25
    Youfei  
    OP
       2019-09-17 11:10:21 +08:00
    @psyche 感觉好像只有这种可行了。但是我是看到有别的方法,但是不知道实现,https://developer.amazon.com/zh/docs/alexa-voice-service/structure-http2-request.html#examples
    armyHcz
        26
    armyHcz  
       2019-09-17 11:28:37 +08:00
    @toxicant 是的
    armyHcz
        27
    armyHcz  
       2019-09-17 11:28:52 +08:00
    @Youfei Summer
    cnbattle
        28
    cnbattle  
       2019-09-17 12:18:56 +08:00 via Android
    二进制 base64 当普通文本返回 可否
    cnbattle
        29
    cnbattle  
       2019-09-17 12:20:29 +08:00 via Android
    @cnbattle 请无视我的内容…
    freestyle
        30
    freestyle  
       2019-09-17 12:32:05 +08:00 via iPhone
    奇怪的需求用奇怪的方式,binary 不大的话 base64 后放 response header 里,客户端也能正常取到的.
    hantsy
        31
    hantsy  
       2019-09-17 12:53:11 +08:00
    @Youfei Multiapart 在 Request Body 还是很常见。 几乎所有的 java web framework 都有 Multipart 处理。你这个 Amazon Link 也是 Request Body。

    你想要的 Response Body 里面使用 Multipart 我是没有见过,不知 Http 是否支持,没看相关 Spec。
    hantsy
        32
    hantsy  
       2019-09-17 12:58:18 +08:00
    可以尝试用最原始的 ResponseWriter 直接写 Multipart 进 Response。
    hantsy
        33
    hantsy  
       2019-09-17 12:59:39 +08:00
    可行与否,我不知道,从来没遇到这种需求。https://stackoverflow.com/questions/47067312/multipart-http-response
    Youfei
        34
    Youfei  
    OP
       2019-09-17 13:00:32 +08:00
    @hantsy 你仔细看,amazon 确实是有 multipart/related response 哦
    Youfei
        35
    Youfei  
    OP
       2019-09-17 13:02:32 +08:00
    @hantsy 多谢,我看一下
    Takamine
        36
    Takamine  
       2019-09-17 19:42:43 +08:00 via Android
    ResponseEntity 看看行不行。
    zzl22100048
        37
    zzl22100048  
       2019-09-17 20:34:35 +08:00
    json 不大的话放 response headers 都行吧,response body 传流
    livnimasileid
        38
    livnimasileid  
       2019-09-18 10:41:54 +08:00
    不是很清楚哦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5801 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 119ms UTC 06:22 PVG 14:22 LAX 22:22 JFK 01:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86