【问题标题】:Upload Youtube using Proxy, per connection and not system wide使用代理上传 Youtube,每个连接而不是系统范围
【发布时间】:2012-10-30 15:03:42
【问题描述】:

我有一个使用 youtube-api 上传视频的 Java 代码。到目前为止,我一直在使用系统配置来设置代理(http 和 https),并且一切正常。但是现在我对我们在服务器上使用代理的方式有了新的要求。由于我们在同一台服务器上运行其他服务,他们要求我不要使用系统范围的方法配置代理,因为这会影响使用 JVM 的所有服务。

System.setProperty("http.proxyHost", httpProxyHost);
System.setProperty("http.proxyPort", httpProxyPort);

System.setProperty("https.proxyHost", httpsProxyHost);
System.setProperty("https.proxyPort", httpsProxyPort);

过去几天我在 Internet 上进行了研究,但没有发现任何有用的信息。我在 C# API 上找到了似乎将代理设置为连接的解释,但我没有找到在 Java 上实现相同方法的方法。

我想做这样的事情:

service = new YouTubeService(APPLICATION_NAME, DEVELOPER_KEY);
service.setUserCredentials(userName, password);
uploader = new ResumableGDataFileUploader.Builder(
        service, new URL(RESUMABLE_UPLOAD_URL), ms, newVideoEntry)
            .title(videoTitle)
            .trackProgress(listener, PROGRESS_UPDATE_INTERVAL)
            .chunkSize(DEFAULT_CHUNK_SIZE).build();

// fictional code to show what I want to do
uploader.setProxyHttp(httpProxyHost, httpProxyPort);
uploader.setProxyHttps(httpsProxyHost, httpsProxyPort);

uploader.start();

这与 Java 已经允许我们做的事情非常相似。看到这个http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

【问题讨论】:

    标签: youtube-api


    【解决方案1】:

    我刚刚用下面的代码解决了。调整 setPersonalUrlConnectionFactory 方法来设置您的代理,并将其作为参数传递给您的上传者。

    package com.google.gdata.client.uploader;
    
    import com.google.gdata.client.media.ResumableGDataFileUploader;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class PersonalUrlConnectionInjector {
    
        public static void setPersonalUrlConnectionFactory(ResumableGDataFileUploader uploader) {
            try {
                java.lang.reflect.Field field = uploader.getClass().getSuperclass().getDeclaredField("urlConnectionFactory");
                field.setAccessible(true);
                java.lang.reflect.Field modifiersField = java.lang.reflect.Field.class.getDeclaredField("modifiers");
                modifiersField.setAccessible(true);
                modifiersField.setInt(field, field.getModifiers() & ~java.lang.reflect.Modifier.FINAL);
    
                field.set(uploader, new UrlConnectionFactory() {
                    @Override
                    public HttpURLConnection create(URL url) throws IOException {
                        return new sun.net.www.protocol.http.HttpURLConnection(url, MY_PROXY);
                    }
                }); 
            } catch (Exception e) {
                /* DO LOG */
            }
        }
    }
    

    【讨论】:

    • 我不再做这个了,如果有人成功使用了这个解决方案,请告诉我,我会将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多