如何从Java中获取curl get请求中的文件?

时间:2016-12-15 12:52:17

标签: java http

我正在尝试使用API​​下载一些XBRL文件。为了做到这一点,我需要做一个卷曲请求,如下所示:

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

根据我的理解,这个想法是“@ query_regnskaber.json”是我需要随请求发送的json文件/ json查询,作为回报,我得到一个XBRL文件/一些数据。我正在使用Java与播放框架(虽然没有专门使用播放框架的curl请求,但也许有人知道一些播放功能来执行curl请求)。

这是我目前的代码:

        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错误。

我能为API找到的唯一文档是丹麦语。它还提到它使用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
}

3 个答案:

答案 0 :(得分:0)

它似乎是后端的ElasticSearch并没有太大变化,

将查询发送到http://distribution.virk.dk/offentliggoerelser是禁止的,就像在ElasticSearch中一样。 (你不能直接查询索引)

但如果您向POST发送GEThttp://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它只是忽略你发送的查询文件,因此吐出一些与你的查询不对应的信息 这显然是错误的。

答案 1 :(得分:0)

(代表OP发布解决方案)

我在网站上添加了“/ _search”,并将请求方法更改为POST。在nafas的回答中解释。

答案 2 :(得分:0)

doOutput设置为TRUE会将其变为POST。删除,以及您发送的任何输出。请求参数应该在GET请求的URL中。