开发者社区 问答 正文

alibaba-dingtalk-service-sdk:2.0.0 代理设置不生效

DefaultDingTalkClient.setProxy(), 设置后对于oapi的请求没有生效。

  1. DefaultDingTalkClient.java link:145-174 executeOApi() 函数调用WebV2Utils.doGetWebV2Utils.doPostWithJson都没有把proxy参数提供进去
  2. WebV2Utils.java link: 281-293 两个doGet()函数都没有提供proxy的入参

展开
收起
1692741011834987 2023-06-08 20:55:45 895 分享 版权
3 条回答
写回答
取消 提交回答
  • 您提供的情况与 alibaba-dingtalk-service-sdk 2.0.0 版本确实存在相关问题,代理设置不生效的情况。

    在 alibaba-dingtalk-service-sdk 2.0.0 的源代码中,的确在请求阶段,没有将代理设置传入请求接口。

    建议您可以采取以下方法解决这个问题:

    1. 将 alibaba-dingtalk-service-sdk 升级至最新版本。据我了解,最新的 alibaba-dingtalk-service-sdk 已经解决了代理设置不生效的问题。

    2. 在您的代码中,重新实现请求接口的过程,并手动传入代理设置。您可以在自己的代码中重写DefaultDingTalkClient.execute()函数,或者在调用 executeOApi() 函数前设置代理。

    举一个手动传入代理设置的例子:通过以下代码,您可以手动设置已有的 DefaultDingTalkClient 的代理:

    DefaultDingTalkClient client = new DefaultDingTalkClient(url, appKey, appSecret);
    HttpProxy proxy = new HttpProxy("xxx.xxx.xxx.xxx", 80);//设置代理
    client.setProxy(proxy);//将代理传入客户端
    DingTalkResponse response = client.execute(request);
    

    注意,其中的 "xxx.xxx.xxx.xxx" 和 80 分别代表代理的 IP 地址和端口号,您需要将其替换为实际的代理地址和端口号。

    2023-06-09 08:42:18
    赞同 展开评论
  • 北京阿里云ACE会长

    1 根据你提供的信息,似乎是在使用 Alibaba DingTalk Service SDK 2.0.0 时设置代理没有生效的问题。根据代码分析,确实可以看到在执行 OAPI 请求时没有将代理参数传递进去。这可能是一个 Bug 或者是设计上的问题。

    如果你需要在使用 Alibaba DingTalk Service SDK 时强制使用代理,可以考虑手动在请求中设置代理。你可以使用 Java 提供的 Proxy 类来创建代理对象,并将其传递给请求。

    示例代码:

    reasonml Copy // 创建代理对象 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxyHost", proxyPort));

    // 创建 DingTalk 客户端 DefaultDingTalkClient client = new DefaultDingTalkClient(url);

    // 设置代理 client.setProxy(proxy);

    // 发送请求 DingTalkResponse response = client.execute(request); 这样,代理参数就会被手动设置,并传递给请求。

    2023-06-09 07:55:39
    赞同 展开评论
  • 根据提供的信息,可以看出在DefaultDingTalkClient中设置proxy参数后,并没有在executeOApi()函数中的doGet()和doPostWithJson()方法中将proxy参数传递进去,导致代理无法生效。

    如果需要让代理生效,需要在executeOApi()函数中的doGet()和doPostWithJson()方法中添加proxy参数的传递。可以通过修改DefaultDingTalkClient类的源码来实现,或者继承DefaultDingTalkClient类,重写executeOApi()函数,在其中添加proxy参数的传递。具体实现方法可以参考以下代码示例:

    public class CustomDingTalkClient extends DefaultDingTalkClient {
    
        private Proxy proxy;
    
        public CustomDingTalkClient(String url, String method, String accessToken) {
            super(url, method, accessToken);
        }
    
        public CustomDingTalkClient(String url, String method, String accessToken, String appKey, String appSecret) {
            super(url, method, accessToken, appKey, appSecret);
        }
    
        public CustomDingTalkClient(String url, String method, String accessToken, String appKey, String appSecret, int connectTimeout, int readTimeout) {
            super(url, method, accessToken, appKey, appSecret, connectTimeout, readTimeout);
        }
    
        public void setProxy(Proxy proxy) {
            this.proxy = proxy;
        }
    
        @Override
        protected String executeOApi() throws ApiException {
            if ("GET".equals(this.httpMethod)) {
                return WebV2Utils.doGet(this.url, this.params, this.charset, this.connectTimeout, this.readTimeout, this.proxy);
            } else {
                return WebV2Utils.doPostWithJson(this.url, this.params, this.charset, this.connectTimeout, this.readTimeout, this.proxy);
            }
        }
    }
    

    在上述示例中,我们继承了DefaultDingTalkClient类,并添加了setProxy()方法和executeOApi()方法的重写。在executeOApi()方法中,我们判断请求方式,如果是GET请求,则调用WebV2Utils.doGet()并传递proxy参数;如果是POST请求,则调用WebV2Utils.doPostWithJson()并传递proxy参数。这样就可以让代理生效了。

    2023-06-08 23:51:30
    赞同 展开评论