V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Youfei
V2EX  ›  Java

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

  •  
  •   Youfei · 2019-09-16 14:55:33 +08:00 · 7343 次点击
    这是一个创建于 1930 天前的主题,其中的信息可能已经有所发展或是发生改变。
    菜鸟遇到了些困难,最近要要完成一个需求要求在一次响应中返回 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 等都是文本序列化
    lc1450
        9
    lc1450  
       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   ·   实用小工具   ·   1475 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:12 · PVG 01:12 · LAX 09:12 · JFK 12:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.