通过代理服务器Microsoft Azure storage SDK for Java连接到Azure存储帐户

通过代理服务器Microsoft Azure storage SDK for Java连接到Azure存储帐户,java,azure,proxy,azure-storage,azure-storage-blobs,Java,Azure,Proxy,Azure Storage,Azure Storage Blobs,在我们的项目中,我们需要通过代理服务器(squid)访问Blob存储 我们正计划使用这项技术。 但看起来API并没有提供设置代理的功能。 我能让它通过代理的唯一方法是设置系统属性 System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "3128"); 但这会影响在我的JVM上运行的所有服务,这会损害不应该通过代理的其他服务 看看java代码,它看起来像 com.micros

在我们的项目中,我们需要通过代理服务器(squid)访问Blob存储

我们正计划使用这项技术。 但看起来API并没有提供设置代理的功能。 我能让它通过代理的唯一方法是设置系统属性

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "3128");
但这会影响在我的JVM上运行的所有服务,这会损害不应该通过代理的其他服务

看看java代码,它看起来像 com.microsoft.azure.storage.core.BaseRequest.createURLConnection(URI、RequestOptions、UriQueryBuilder、OperationContext)。正在调用不带代理的java.net.URL.openConnection()。 使用java.net.URL时,openConnection(代理)可以提供所需的支持吗

我觉得这是不受支持的?
我错过什么了吗


更新:我在azure storage java git中打开了一个关于此的应用程序,我很高兴收到您的输入,因为我想建议对此应用程序的拉取请求。

到目前为止,还没有java SDK API支持通过代理服务器直接访问azure存储,因为BaseRequest类在函数中缺少“url.openConnection(proxy)”“公共静态HttpConnection createURLConnection(…)”

根据我的经验,有两种方法可以帮助您实现访问功能

一个是,您可以通过java.net.Proxy类使用Azure Storage REST API来访问存储服务

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port));
URLConnection conn = url.openConnection(proxy);
And if you should be authorize proxy user & password, you can do it as the follows:
//Proxy-Authorization: Basic <Base64.encode(user:password)>
String headerKey = "Proxy-Authorization";
String headerValue = "Basic " + Base64.encode(user+":"+password);
conn.setRequestProperty(headerKey, headerValue);
顺便说一句,您需要在每个CloudXXXClient(CloudBlobClient等)类中调用上述方法。

继我根据这个问题打开的和strazh打开的另一个之后,代理支持在版本4.2.0中得到了改进,请参阅

添加了对设置库范围代理的支持。默认代理可以 必须在OperationContext上设置

有关完整示例,请参见JUnits


查找testDefaultProxy和testProxy,Azure存储团队发布了一个新的SDK(v10),其中代理现在通过HttpPipeline得到支持。您可以通过将其传递到StorageURL跨所有操作共享管道,或者通过将其传递到BlobURL对象仅在单个Blob中使用

AnonymousCredentials creds = new AnonymousCredentials();

// Use PipelineOptions to define a retry strategy and a proxy - you can also pass your own HttpClient to this if you like
PipelineOptions po = new PipelineOptions();

// Proxy configuration shown here as a sample
HttpClientConfiguration configuration = new HttpClientConfiguration(
      new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8888)), false); //pass true if the Proxy endpoint is HTTPS
po.client = HttpClient.createDefault(configuration);


// Create a URI with SAS token, and pass it to the PageBlobURL with an HttpPipeline created by createPipeline method
URL u = new URL("https://myaccount.blob.core.windows.net/mycontainer/myfile?sv=2017-04-17&sr=b&si=14169767-6354-41ed-a99b-c9db8dcc66bc&sig=8NUr%2BSpmRH%2BB2z%2FpQZDPDquTQ7rbgWfE9a6AePLlFT0%3D");
PageBlobURL blobURL = new PageBlobURL(u, PageBlobURL.createPipeline(creds, po));

谢谢你的回答,但你的建议不起作用,因为该方法是静态的,无法重写。到目前为止,我找到的唯一选择是创建拉请求,并希望Azure团队接受itI。我将使用REST API编写一个示例程序向你展示。
AnonymousCredentials creds = new AnonymousCredentials();

// Use PipelineOptions to define a retry strategy and a proxy - you can also pass your own HttpClient to this if you like
PipelineOptions po = new PipelineOptions();

// Proxy configuration shown here as a sample
HttpClientConfiguration configuration = new HttpClientConfiguration(
      new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8888)), false); //pass true if the Proxy endpoint is HTTPS
po.client = HttpClient.createDefault(configuration);


// Create a URI with SAS token, and pass it to the PageBlobURL with an HttpPipeline created by createPipeline method
URL u = new URL("https://myaccount.blob.core.windows.net/mycontainer/myfile?sv=2017-04-17&sr=b&si=14169767-6354-41ed-a99b-c9db8dcc66bc&sig=8NUr%2BSpmRH%2BB2z%2FpQZDPDquTQ7rbgWfE9a6AePLlFT0%3D");
PageBlobURL blobURL = new PageBlobURL(u, PageBlobURL.createPipeline(creds, po));