Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java不读取内容长度响应头?_Java_Networking_Web_Content Length - Fatal编程技术网

为什么java不读取内容长度响应头?

为什么java不读取内容长度响应头?,java,networking,web,content-length,Java,Networking,Web,Content Length,我有下面的代码来读取由下面的url指向的资源的内容长度响应头,但是这段代码不读取内容长度并返回-1。我想知道为什么 try{ String song_url = "https://doc-0c-6o-docs.googleusercontent.com/docs/securesc/mtop3kcd4g9holc81thpce8mmck772ja/10to2su90o897bl390ojai9srph2fmvq/1407182400000/15635312626103908265/15635

我有下面的代码来读取由下面的url指向的资源的内容长度响应头,但是这段代码不读取内容长度并返回-1。我想知道为什么

 try{


String song_url = "https://doc-0c-6o-docs.googleusercontent.com/docs/securesc/mtop3kcd4g9holc81thpce8mmck772ja/10to2su90o897bl390ojai9srph2fmvq/1407182400000/15635312626103908265/15635312626103908265/0B8CobC-HnuclMm5sUnVpOW13eEk?e=download&h=16653014193614665626&nonce=5beqd4pl58o30&user=15635312626103908265&hash=qbqjjhkrpco10b8ggu7ko5qa5c64th2m";


                    URL web = new URL(song_url);

                    con1 = web.openConnection();

                     total_size = con1.getContentLength();

                    ((HttpURLConnection)con1).disconnect();

                    return total_size;

                }
                catch(Exception e){

                    e.printStackTrace();
                }

                ((HttpURLConnection)con1).disconnect();
现在,奇怪的是,如果你只是将这个url粘贴到浏览器中

然后在google chrome的inspect element>network下,您将看到浏览器正确读取了内容长度

内容长度:79476777


但为什么java代码无法读取内容长度?这是我使用的图书馆的问题吗?谢谢你的帮助

这可能是因为服务器没有发送内容长度头。至少还有两种其他方式可以传达长度:

  • 在发送请求正文后关闭套接字。在HTTP1.1中,我认为这必须伴随一个“Connection:close”头。在本例中,内容长度是主体的长度,您必须阅读所有内容才能测量它

  • 通过使用分块传输编码。在这种情况下,内容长度是块的长度之和。同样地,你必须通读一遍才能确定长度


  • 在获取内容长度之前,您必须
    con1.connect()
    。很抱歉,它仍然返回-1如果服务器使用HTTP分块,则在读取所有字节之前,您无法访问内容长度(这就是重点:允许未指定的内容长度,从而启用高级用例,例如动态gzip)。通常来说,ContentLength在HTTP上是不可靠的。但如果您在chrome“inspect element”>“network”中执行此步骤,浏览器显示它正在返回内容长度这是因为您的资源受密码保护。您的Java客户端被重定向到google的HTML登录页面。我认为服务器正在发送内容长度标题。正如我在上面的帖子中所提到的“然后在google chrome中的inspect element>network下,您将看到浏览器正确读取了内容长度”浏览器在响应字段中显示内容长度标题。正如@GPI在上面指出的,这不是您的Java客户端正在阅读的页面。它正在阅读一个登录页面,该页面显然没有内容长度标题发送。但如果您可以访问上面的链接,则我认为它不会重定向到登录页面。您可以随心所欲地想,但不必担心如果你试着和你的客户一起阅读内容,并在这里发布足够的内容来证明这一点,那只是你的猜测。现在我得到了一个登录屏幕。QED