Youtube api 使用代理上传Youtube,每个连接,而不是系统范围

Youtube api 使用代理上传Youtube,每个连接,而不是系统范围,youtube-api,Youtube Api,我有一个使用youtube api上传视频的Java代码。到目前为止,我一直在使用系统配置来设置代理(http和https),这样一切都很好。但是现在我有一个关于在服务器上使用代理的新要求。由于我们在同一台服务器上运行其他服务,他们要求我不要使用系统范围的方法配置代理,因为这会影响使用JVM的所有服务 System.setProperty("http.proxyHost", httpProxyHost); System.setProperty("http.proxyPort", httpProx

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

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

我花了几天时间在互联网上研究,没有发现任何有用的东西。我在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已经允许我们做的事情非常相似。看到这个了吗?

我刚刚用下面的代码解决了这个问题。调整方法
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 */
        }
    }
}

我不再做这个了,如果有人成功地使用了这个解决方案,请告诉我,我会将答案标记为已接受。
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 */
        }
    }
}