HTTP GET用空体来响应,在IE下载excel文件

我试图找出当我下载一个Excel报告时,在这个页面上发生了什么。 它只适用于Internet Explorer,当我尝试使用ScalaJ在Scala中下载报告时,响应正文的inputstream为空。 有人能帮我理解这里发生了什么吗?

明文请求:

GET /oca_ReportViewer.aspx?ReportName=District_and_Statutory_County_Court/DSC_Civil_Family_Activity_Detail_N.rpt&ddlFromMonth=9&ddlFromYear=2010&txtFromMonthField=@FromMonth&txtFromYearField=@FromYear&ddlToMonth=10&ddlToYear=2010&txtToMonthField=@ToMonth&txtToYearField=@ToYear&ddlCountyPostBack=0&txtCountyPostBackField=@CountyID&chkAggregateMonthlyReport=0&export=1625 HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Referer: http://card.txcourts.gov/ReportSelection.aspx Accept-Language: en-US User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: card.txcourts.gov Connection: Keep-Alive Cache-Control: no-cache Cookie: ASP.NET_SessionId=j0tgci45qj3t1uqygrvkqz55 

到目前为止的代码:

 import java.io.{BufferedOutputStream, FileOutputStream, FileWriter, InputStream} import scalaj.http._ object Downloader extends App { val url = "http://card.txcourts.gov/oca_ReportViewer.aspx" val keys: Map[String, String] = Map ( ("ReportName", "District_and_Statutory_County_Court/DSC_Civil_Family_Activity_Detail_N.rpt"), ("ddlFromMonth", "9"), ("ddlFromYear", "2010"), ("txtFromMonthField", "@FromMonth"), ("txtFromYearField", "@FromYear"), ("ddlToMonth", "10"), ("ddlToYear", "2010"), ("txtToMonthField", "@ToMonth"), ("txtToYearField", "@ToYear"), ("ddlCountyPostBack", "0"), ("txtCountyPostBackField", "@CountyID"), ("chkAggregateMonthlyReport", "0"), ("export", "1625") ) //println(keys) val heads: Map[String, String] = Map ( ("Accept", "text/html, application/xhtml+xml, image/jxr, */*"), ("Accept-Encoding", "gzip, deflate"), ("Accept-Language", "en-US"), ("Cache-Control", "no-cache"), ("Connection", "Keep-Alive"), ("Cookie", "ASP.NET_SessionId=j0tgci45qj3t1uqygrvkqz55"), ("Host", "card.txcourts.gov"), ("Referer", "http://card.txcourts.gov/ReportSelection.aspx"), ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko") ) def parse(status: Int, headers: Map[String, IndexedSeq[String]], inputStream: InputStream): Unit = { val output = new BufferedOutputStream(new FileOutputStream("test.xls")) val bytes = new Array[Byte](1024) //1024 bytes - Buffer size //println(status) //println(headers) Stream .continually (inputStream.read(bytes)) .takeWhile (-1 !=) .foreach (read=>output.write(bytes,0,read)) output.close() } val response: HttpResponse[Unit] = Http(url).params(keys).headers(heads).charset("US-ASCII").timeout(1000, 60000).exec[Unit](parse) println(response.isSuccess) } 

如果有人能帮助我,我将不胜感激! 我只需要将响应保存到.xls文件。 如果你有时间的话,我也无法find浏览器正在提取会话ID的位置,所以这也是很有帮助的。

编辑:

我可以看到,Excel数据实际上是发送,检查出这个stream遵循使用wireshark:

流

谢谢!

好吧,不太确定为什么我的stream是空的,但我改变了代码,只是closures输出stream,当它的exception。 我知道这是愚蠢的,但它的工作和文件下载完全。 如果其他人知道更好的解释,我会很感激!

这是新的parsing函数:

 def parse(status: Int, headers: Map[String, IndexedSeq[String]], inputStream: InputStream): Unit = { val output = new BufferedOutputStream(new FileOutputStream(filename)) try { Iterator .continually (inputStream.read) .takeWhile (-1 !=) .foreach (output.write) } catch { case _: Throwable => output.close() } finally{ output.close() } }