【问题标题】:Talend: REST Call results in either "URI is not absolute" or "UnknownHostException"Talend:REST 调用导致“URI 不是绝对的”或“UnknownHostException”
【发布时间】:2016-07-21 10:44:50
【问题描述】:

我正在尝试借助 Talend Jaspersoft ETL Express 5.6 版将数据从 REST API 获取到我们的数据库。 为了确保我的问题与我们的服务器配置无关,我也在本地安装了该工具并卡住了。由于我是一名学生,对 java 的经验并不丰富,但需要为他的公司进行这项工作,我希望你能帮助我。我只有一些基础知识,所以我没有尝试在“代码”选项卡中找到解决方案,只与设计师合作。

最后我想试试下面的教程: http://dwetl.com/2015/08/11/trest-use-case-example-use-rest-api-in-talend/ 但这对我也不起作用。当我在浏览器中使用调用时,我可以获取数据,但使用该工具我只会收到错误。

使用“https://api.github.com/users/mralexgray/followers”作为 URL 我得到一个 UnknownHostException:

    Starte Job Test am 11:20 21/07/2016.

[statistics] connecting to socket on port 3941
[statistics] connected
Exception in component tREST_1
com.sun.jersey.api.client.ClientHandlerException: java.net.UnknownHostException: api.github.com
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131)
    at com.sun.jersey.api.client.Client.handle(Client.java:616)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:559)
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:182)
    at testetl.test_0_1.Test.tREST_1Process(Test.java:572)
    at testetl.test_0_1.Test.runJobInTOS(Test.java:929)
    at testetl.test_0_1.Test.main(Test.java:786)
Caused by: java.net.UnknownHostException: api.github.com
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
[statistics] disconnected
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:218)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129)
    ... 6 more
Job Test endet am 11:20 21/07/2016. [exit code=1]

如果我切断“https://”部分并使用“api.github.com/users/mralexgray/followers”作为网址,我会收到错误“Uri is not absolute”

Starte Job Test am 11:31 21/07/2016.

[statistics] connecting to socket on port 3809
[statistics] connected
Exception in component tREST_1
com.sun.jersey.api.client.ClientHandlerException: java.lang.IllegalArgumentException: URI is not absolute
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131)
    at com.sun.jersey.api.client.Client.handle(Client.java:616)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:559)
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:182)
    at testetl.test_0_1.Test.tREST_1Process(Test.java:572)
    at testetl.test_0_1.Test.runJobInTOS(Test.java:929)
    at testetl.test_0_1.Test.main(Test.java:786)
Caused by: java.lang.IllegalArgumentException: URI is not absolute
    at java.net.URI.toURL(Unknown Source)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:140)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:129)
    ... 6 more
[statistics] disconnected
Job Test endet am 11:31 21/07/2016. [exit code=1]

只是为了给你尽可能多的信息,这里是自动生成的 java 代码的一小部分,对我来说似乎是关于这个 REST 调用的,但也许我完全错了,这根本没有帮助,因为我只有基本的java知识:

        /**
         * [tREST_1 begin ] start
         */

        ok_Hash.put("tREST_1", false);
        start_Hash.put("tREST_1", System.currentTimeMillis());

        currentComponent = "tREST_1";

        int tos_count_tREST_1 = 0;

        String endpoint_tREST_1 = "api.github.com/users/mralexgray/followers";

        String trustStoreFile_tREST_1 = System
                .getProperty("javax.net.ssl.trustStore");
        String trustStoreType_tREST_1 = System
                .getProperty("javax.net.ssl.trustStoreType");
        String trustStorePWD_tREST_1 = System
                .getProperty("javax.net.ssl.trustStorePassword");

        String keyStoreFile_tREST_1 = System
                .getProperty("javax.net.ssl.keyStore");
        String keyStoreType_tREST_1 = System
                .getProperty("javax.net.ssl.keyStoreType");
        String keyStorePWD_tREST_1 = System
                .getProperty("javax.net.ssl.keyStorePassword");

        com.sun.jersey.api.client.config.ClientConfig config_tREST_1 = new com.sun.jersey.api.client.config.DefaultClientConfig();
        javax.net.ssl.SSLContext ctx_tREST_1 = javax.net.ssl.SSLContext
                .getInstance("SSL");

        javax.net.ssl.TrustManager[] tms_tREST_1 = null;
        if (trustStoreFile_tREST_1 != null
                && trustStoreType_tREST_1 != null) {
            char[] password_tREST_1 = null;
            if (trustStorePWD_tREST_1 != null)
                password_tREST_1 = trustStorePWD_tREST_1.toCharArray();
            java.security.KeyStore trustStore_tREST_1 = java.security.KeyStore
                    .getInstance(trustStoreType_tREST_1);
            trustStore_tREST_1.load(new java.io.FileInputStream(
                    trustStoreFile_tREST_1), password_tREST_1);

            javax.net.ssl.TrustManagerFactory tmf_tREST_1 = javax.net.ssl.TrustManagerFactory
                    .getInstance(javax.net.ssl.KeyManagerFactory
                            .getDefaultAlgorithm());
            tmf_tREST_1.init(trustStore_tREST_1);
            tms_tREST_1 = tmf_tREST_1.getTrustManagers();
        }

        javax.net.ssl.KeyManager[] kms_tREST_1 = null;
        if (keyStoreFile_tREST_1 != null
                && keyStoreType_tREST_1 != null) {
            char[] password_tREST_1 = null;
            if (keyStorePWD_tREST_1 != null)
                password_tREST_1 = keyStorePWD_tREST_1.toCharArray();
            java.security.KeyStore keyStore_tREST_1 = java.security.KeyStore
                    .getInstance(keyStoreType_tREST_1);
            keyStore_tREST_1.load(new java.io.FileInputStream(
                    keyStoreFile_tREST_1), password_tREST_1);

            javax.net.ssl.KeyManagerFactory kmf_tREST_1 = javax.net.ssl.KeyManagerFactory
                    .getInstance(javax.net.ssl.KeyManagerFactory
                            .getDefaultAlgorithm());
            kmf_tREST_1.init(keyStore_tREST_1, password_tREST_1);
            kms_tREST_1 = kmf_tREST_1.getKeyManagers();
        }

        ctx_tREST_1.init(kms_tREST_1, tms_tREST_1, null);
        config_tREST_1
                .getProperties()
                .put(com.sun.jersey.client.urlconnection.HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                        new com.sun.jersey.client.urlconnection.HTTPSProperties(
                                new javax.net.ssl.HostnameVerifier() {

                                    public boolean verify(
                                            String hostName,
                                            javax.net.ssl.SSLSession session) {
                                        return true;
                                    }
                                }, ctx_tREST_1));

        com.sun.jersey.api.client.Client restClient_tREST_1 = com.sun.jersey.api.client.Client
                .create(config_tREST_1);
        com.sun.jersey.api.client.WebResource restResource_tREST_1;
        if (endpoint_tREST_1 != null && !("").equals(endpoint_tREST_1)) {
            restResource_tREST_1 = restClient_tREST_1
                    .resource(endpoint_tREST_1);
        } else {
            throw new IllegalArgumentException("url can't be empty!");
        }

        com.sun.jersey.api.client.ClientResponse errorResponse_tREST_1 = null;
        String restResponse_tREST_1 = "";
        try {

            restResponse_tREST_1 = restResource_tREST_1

            .get(String.class);

        } catch (com.sun.jersey.api.client.UniformInterfaceException ue) {
            errorResponse_tREST_1 = ue.getResponse();
        }

        // for output

        row1 = new row1Struct();
        if (errorResponse_tREST_1 != null) {
            row1.ERROR_CODE = errorResponse_tREST_1.getStatus();
        } else {
            row1.Body = restResponse_tREST_1;
        }

        /**
         * [tREST_1 begin ] stop
         */

        /**
         * [tREST_1 main ] start
         */

任何帮助将不胜感激:)。我所有的例子都是关于那个教程的,但是当我试图让我们真正的 API 与 ETL 一起工作时,我遇到了完全相同的问题,我想这个教程作为例子更容易给你们。

【问题讨论】:

    标签: rest uri etl talend


    【解决方案1】:

    我们终于可以找到解决连接问题的方法。 我不知道为什么 Talend 没有正确使用我们的代理,即使它在首选项中手动设置,但如果我们使用 tSetProxy 组件,它可以工作并从服务器获取预期的 JSON 对象。

    【讨论】:

      【解决方案2】:

      java.net.UnknownHostException:你检查过你是否在代理后面吗?如果从您的工作室位置无法访问该站点,则应该会发生前面的错误。

      您必须知道您的浏览器不一定具有与 Talend Studio 相同的配置。因此,请检查您的“Internet 设置”是否存在任何代理。如果是这种情况,则可以在菜单中更改代理设置:窗口 -> 首选项,在常规 -> 网络下。

      【讨论】:

      • 感谢您的回答。我今天又在公司,所以我尽快检查了那个代理的东西。如果我转到 C:\WINDOWS\System32\inetcpl.cpl 并查看“连接”选项卡,它显示我没有设置任何内容。因为 LAN 设置是一个代理服务器集,现在我尝试取消选中“绕过本地地址的代理服务器”,如果我这样做了,我会得到一个不同的错误,我将它上传到 pastebin:pastebin.com/USZ4yraz 所以对我来说似乎,设置的代理似乎没问题,我需要选中此框吗?也许我可以用这些代理设置尝试其他方法?
      • 我刚刚意识到,错误并没有什么不同,因为我未选中该复选框。我创建此线程时发布的错误消息来自使用我的本地安装。检查我的本地代理设置告诉我,有一个固定的“自动配置”我无法更改,因为我的公司不给我这样做的权利。在最终应该使用的服务器上,情况并非如此,但我们手动使用代理服务器。当我打开或关闭此代理时,它似乎根本不会影响服务器消息(请参阅 pastebin)
      • 正如我在上一条消息中所写,如果在 Internet 设置中设置了代理,您也必须为 Talend Studio 设置它。 Talend Studio 不会自动获取代理的系统设置。
      • 您必须转到 Talend Studio -> 窗口 -> 首选项,在常规 -> 网络连接下。您将找到代理设置。在那里,您必须将 Active Provider 切换为“Native”(或放置手动代理设置)。
      • 啊抱歉,我没明白这是关于 Talend Studio 本身的。但是在那些设置中它是在 Native 并且代理也被写入其中,我尝试将其更改为手动并在那里编写代理,但这没有帮助 - 错误仍然存​​在
      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2022-01-19
      • 2020-10-19
      • 1970-01-01
      相关资源
      最近更新 更多