2016-12-15 62 views
0

我正在嘗試使用API​​下載一些XBRL文件。爲了做到這一點,我需要做一個捲曲的請求,就像這樣:如何從Java中的curl get請求獲取文件?

curl -XGET http://distribution.virk.dk/offentliggoerelser --data-binary @query_regnskaber.json 

的想法是,按照我的理解,認爲「@ query_regnskaber.json」是一個JSON文件/ JSON查詢,我需要發送我的請求,並作爲回報,我得到一個XBRL文件/一些數據。我正在使用Java與播放框架(雖然不專門使用播放框架,但也許有人知道一些播放功能來執行卷曲請求)。

這是我當前的代碼:

 String jsonStr = 
    "{" + 
     "\"query\": {" + 
     "\"bool\": {" + 
      "\"must\": [" + 
      "{" + 
       "\"term\": {" + 
        "\"offentliggoerelse.dokumenter.dokumentMimeType\": \"application\"" + 
      "}" + 
      "}," + 
      "{" + 
       "\"term\": {" + 
        "\"offentliggoerelse.dokumenter.dokumentMimeType\": \"xml\"" + 
      "}" + 
      "}," + 
      "{" + 
       "\"range\": {" + 
        "\"offentliggoerelse.offentliggoerelsesTidspunkt\": {" + 
         "\"from\": \"2016-12-01\"" + 
        "}" + 
       "}" + 
      "}" + 
      "]," + 
      "\"must_not\": []," + 
      "\"should\": []" + 
     "}" + 
    "}," + 
     "\"size\": 1000" + 
    "}"; 
    String urlStr = "http://distribution.virk.dk/offentliggoerelser"; 
    JSONObject jsonObj = new JSONObject(jsonStr); 
    URL myURL = new URL(urlStr); 
    HttpURLConnection urlCon = (HttpURLConnection)myURL.openConnection(); 
    urlCon.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
    urlCon.setRequestMethod("GET"); 
    urlCon.setDoInput(true); 
    urlCon.setDoOutput(true); 
    urlCon.connect(); 
    OutputStream os = urlCon.getOutputStream(); 
    os.write(jsonObj.toString().getBytes("UTF-8")); 
    os.close(); 
    BufferedReader br = new BufferedReader(new InputStreamReader((urlCon.getInputStream()))); 
    String output; 
    System.out.println("Output from Server .... \n"); 
    while ((output = br.readLine()) != null) { 
     System.out.println(output); 
    } 
    urlCon.disconnect(); 

不順心的事,我不知道是否是因爲一些失蹤的設置,我的代碼或兩者兼而有之。我在「urlCon.getInputStream()」調用中遇到了403錯誤。

我能找到的唯一文檔是丹麥文。它還提到它使用ElasticSearch,我假設它用於查找可在「http://distribution.virk.dk/offentliggoerelser/_search」上找到的特定XBRL文件。找到特定的XBRL文件是我想要做的。以防萬一,這裏是鏈接到API documentation

我正在使用可以在我的代碼中的文檔中找到的示例json查詢。

謝謝你的幫助。

的json測試查詢:

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "offentliggoerelse.dokumenter.dokumentMimeType": "application" 
        } 
       }, 
       { 
        "term": { 
         "offentliggoerelse.dokumenter.dokumentMimeType": "xml" 
        } 
       }, 
       { 
        "range": { 
         "offentliggoerelse.offentliggoerelsesTidspunkt": { 
          "from": "2014-10-01" 
         } 
        } 
       } 
      ], 
      "must_not": [], 
      "should": [] 
     } 
    }, 
    "size": 1000 
} 
+1

如果您不允許訪問此資源,則會返回'403 Forbidden'。在JSON文檔中設置了憑據嗎? – rmuller

+0

您是否嘗試過測試您的json請求?我建議使用郵遞員這樣的工具,並確保API調用按照預期使用json請求返回。 –

+0

[http get request with body]的可能重複(http://stackoverflow.com/questions/27180431/http-get-request-with-body) – glee8e

回答

0

似乎它的一個ElasticSearch在後端並沒有太大的改變,

發送查詢http://distribution.virk.dk/offentliggoerelser是被禁止的是在ElasticSearch。 (您無法直接查詢索引)

但是,如果你發送POSTGET似乎太工作)查詢http://distribution.virk.dk/offentliggoerelser/_search(注:/_search)應該工作 所以更改

String urlStr = "http://distribution.virk.dk/offentliggoerelser"; 

String urlStr = "http://distribution.virk.dk/offentliggoerelser/_search"; 

可選地更改

urlCon.setRequestMethod("GET"); 

urlCon.setRequestMethod("POST"); 

注:

的情況下,你想知道爲什麼你的作品CURL, 還有沒有,因爲你用的XGET代替XPOST它簡單地忽略查詢文件你因此發送吐出的一些信息與您的查詢 不符,這顯然是錯誤的。

+0

Woah!發生了一些事情,我得到了大量的數據,這實際上解決了我表達的問題,謝謝!現在我需要檢查數據是什麼所有關於,因爲考慮到我的查詢,我懷疑我應該獲得那麼多的數據,但我可能會錯誤地假設。無論如何,謝謝:) – Marcus

+0

@馬庫斯很好,一種檢查方法是看結果的數量。在返回的json對象中,如果您在頁面頂部檢查,您應該看到「total」:13542' with query和'「total」:1160917'沒有查詢。這意味着你的查詢工作(如果它是一個正確的查詢或不好,這是你要驗證的東西):) – nafas

+0

如果你從來沒有與'ElasticSearch'工作,你應該閱讀文檔,你可以做奇蹟:) – nafas

0

(發表解決方案代表OP)

我在網站中添加了「/ _search」,並將請求方法更改爲POST。納法斯的回答中的解釋。

0

doOutput設置爲TRUE會將其變爲POST。刪除,以及你發送的任何輸出。請求參數應該位於GET請求的URL中。