2012-10-30 32 views
2

我有一個使用youtube-api上傳視頻的Java代碼。到目前爲止,我正在使用系統配置來設置代理(http和https),並且一切工作都很好。但是現在我對我們在服務器上使用代理的方式有了一個新的要求。由於我們在同一臺服務器上運行其他服務,他們要求我不要使用全系統方法配置代理,因爲這會影響使用JVM的所有服務。使用代理,每個連接而不是系統上傳Youtube

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

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

我已經花了過去幾天研究了互聯網上,並沒有發現任何有用的東西。我發現了一個關於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

回答

0

我剛剛用下面的代碼解決。調整方法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 */ 
     } 
    } 
} 
+0

我不再工作了,如果有人在成功的情況下使用了這個解決方案,請告訴我,我會將答案標記爲已接受。 – BertKlinger

相關問題