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