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

为啥我的 Http 响应响应头和响应体之间还有些东西呢?这些字节代表啥意思呢?

  •  1
     
  •   clearbug · 2017-12-26 10:21:28 +08:00 · 4021 次点击
    这是一个创建于 2536 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写贴代码吧:

    Socket socket = new Socket();
    InetSocketAddress inetSocketAddress = new InetSocketAddress("music.163.com", 80);
    socket.connect(inetSocketAddress);
    
    OutputStream outputStream = socket.getOutputStream();
    BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
    bufferedWriter.write("GET /artist?id=10000 HTTP/1.1\r\n");
    bufferedWriter.write("Host: music.163.com\r\n");
    bufferedWriter.write("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\r\n");
    bufferedWriter.write("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n");
    bufferedWriter.write("Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,fr;q=0.7\r\n");
    bufferedWriter.write("\r\n");
    bufferedWriter.flush();
    
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 1024 * 4);
    int len;
    while ((len = inputStream.read(bytes, 0, bytes.length)) > 0) {
        baos.write(bytes, 0, len);
    }
    System.out.println(baos.toString(StandardCharsets.UTF_8.name()));
    

    输出如下:

    HTTP/1.1 200 OK
    Server: nginx
    Date: Tue, 26 Dec 2017 02:14:35 GMT
    Content-Type: text/html;charset=utf8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Vary: Accept-Encoding
    Cache-Control: no-store
    Pragrma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: no-cache
    Content-Language: zh-CN
    X-Via: MusicServer
    X-From-Src: 218.17.158.4
    
    a3e
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="baidu-site-verification" content="cNhJHKEzsD" />
    <meta property="qc:admins" content="27354635321361636375" />
    ...
    </head>
    <body>
    ...
    </body>
    </html>
    

    响应里面,响应头和响应体之间的 'a3e\n' 是什么鬼?是因为网易的服务器没严格按照 http 协议来吗?还是说有啥特殊含义呢?

    第 1 条附言  ·  2017-12-26 11:39:29 +08:00
    已经找到答案,感觉各位老铁,结贴吧!
    17 条回复    2017-12-26 13:13:01 +08:00
    gouchaoer
        1
    gouchaoer  
       2017-12-26 10:26:11 +08:00
    是 BOM 头么?
    janxin
        2
    janxin  
       2017-12-26 10:30:52 +08:00
    a3e\n 是本来就是 body 里的
    wsy2220
        3
    wsy2220  
       2017-12-26 10:33:55 +08:00
    mengzhuo
        4
    mengzhuo  
       2017-12-26 10:37:53 +08:00
    Chunked 编码啊
    难道 Java 连个标准 HTTP 库都没有么(手动滑稽
    fcten
        5
    fcten  
       2017-12-26 10:49:49 +08:00   ❤️ 1
    Transfer-Encoding: chunked

    a3e 表示的是后面内容的长度
    Shazoo
        6
    Shazoo  
       2017-12-26 10:51:33 +08:00
    连接服务器的 response header 里面已经告诉你 transfer-encoding 是 chunked 模式了。(而且,没给你 content-length ……)

    Transfer-Encoding: chunked

    chunked 是蛮老的一种传输方式。


    这个一般被底层 http 库封装。由于你是用 socket 直连实现 http 协议,就暴露出来了。
    clearbug
        7
    clearbug  
    OP
       2017-12-26 11:36:58 +08:00
    @wsy2220 #3
    @mengzhuo #4 谢谢两位老铁了,今天才认识到 http 协议还有那么多东西
    clearbug
        8
    clearbug  
    OP
       2017-12-26 11:37:21 +08:00
    clearbug
        9
    clearbug  
    OP
       2017-12-26 11:37:46 +08:00
    @gouchaoer #1
    @janxin #2 3 楼 4 楼正解了
    clearbug
        10
    clearbug  
    OP
       2017-12-26 11:38:38 +08:00
    @Shazoo #6 嗯嗯谢谢,就是为了熟悉 http 协议,所以才直接用 socket 的
    clearbug
        11
    clearbug  
    OP
       2017-12-26 11:40:23 +08:00
    @fcten #5 嗯嗯明白了,谢谢
    clearbug
        12
    clearbug  
    OP
       2017-12-26 11:41:49 +08:00
    @mengzhuo #4 哈哈,感觉 java9 之前的 http client 都是用的类库,目测 java9 的原生的 http client 很好用了
    misaka19000
        13
    misaka19000  
       2017-12-26 11:44:57 +08:00
    这个东西和 content-length 有什么区别吗?
    clearbug
        14
    clearbug  
    OP
       2017-12-26 12:18:49 +08:00
    torbrowserbridge
        16
    torbrowserbridge  
       2017-12-26 12:32:44 +08:00 via Android
    难道 chunked 编码最后不应该有个 0 么
    clearbug
        17
    clearbug  
    OP
       2017-12-26 13:13:01 +08:00 via Android
    @torbrowserbridge 是有的,只是我上面贴的响应内容没贴全,之前没理解 chunked 编码,所以一直关注前面 a3e 的含义了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.