2017-05-16 9 views
3

Excelのレポートをダウンロードするときに、thisページで何が起こっているのか把握しようとしています。これはInternet Explorerでのみ機能し、ScalaJを使用してScalaでレポートをダウンロードしようとすると、レスポンス本文の入力ストリームがnullになります。誰かがここで何が起こっているのか理解できるように助けることができますかHTTP GETが空のボディで応答しました。

平文の要求:これまで

GET /oca_ReportViewer.aspx?ReportName=District_and_Statutory_County_Court/DSC_Civil_Family_Activity_Detail_N.rpt&ddlFromMonth=9&ddlFromYear=2010&[email protected]&[email protected]&ddlToMonth=10&ddlToYear=2010&[email protected]&[email protected]&ddlCountyPostBack=0&[email protected]&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ファイルに保存するだけでいいです。また、時間があれば、ブラウザがセッションIDを取得している場所を見つけることができないように見えるので、これも本当に役立つでしょう。

EDIT:

私がチェックアウトし、Excelデータが実際に送信されていることを見ることができ、このストリームのwiresharkを使用して、次のとおりです。

stream

ありがとう!

+0

あなたは何Scalaのバージョンを使用していますか?私はscala 2.11.11でコードを実行し、多くのバイトが出力に印刷された後(ファイルに書き込む代わりにそれらを印刷した)、 '.continually(inputStream.read(bytes))に' NullPointerException'を取得しました。 – Dani

+0

2.12.2、ロールバックしてみましょう。 – ztaylor54

答えて

1

私のストリームがnullになっている理由はわかりませんが、例外が発生したときに出力ストリームを閉じるようにコードを変更しました。私はこれが愚かであることを知っていますが、それは働き、ファイルは完全にダウンロードされます。他の誰かがより良い説明を知っていれば、私はそれを感謝します!

は、ここで新しい解析機能です:

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() 
    } 
    } 
関連する問題