2

语境

我有一个桌面 JAVA 应用程序,用于将文件(blob)上传到谷歌应用程序 blobstore。直接连接到 Internet 时一切正常,但通过 HTTP 代理 (Squid) 进行身份验证时就不行了。

我正在使用 httpClient 4.2.3,但没有收到任何错误或响应。它只是在调用时卡住了httpClient.execute(post)

代码

我添加了这些行来处理代理身份验证,并且在使用 URL 获取页面时效果很好:

    System.setProperty("http.proxyUser", username);
    System.setProperty("http.proxyPassword", password);    

我也试过了:

    Authenticator.setDefault(
       new Authenticator() {
           @Override
          public PasswordAuthentication getPasswordAuthentication() {
             return new PasswordAuthentication(
                   username, password.toCharArray());
          }
       }
    );

从现在开始,这与不使用代理时工作的代码相同。

首先,我下载一个页面,在该页面中获取用于将文件发布到 blobstore 的 url:

    URL url = new URL("http://www.example.com/get-upload-url.jsp");        
    String urlWhereToPost=IOUtils.toString(url.openStream());  
    
    DefaultHttpClient  client = new DefaultHttpClient ();

在这里,我们准备多部分帖子:

    HttpPost post
             = new HttpPost( urlWhereToPost.trim() );
    MultipartEntity entity 
             = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE);

    entity.addPart( "key" 
                    , new FileBody(new File(jpgFilePath)
                    , "image/jpeg" )
                    );

    post.setEntity((HttpEntity)entity);
       

正是在调用 execute 时,什么也没有发生(而且它永远不会进入下一条指令):

    HttpResponse execute = client.execute( post );

测试

我一直在尝试几件事,但没有任何效果:

  • 一开始我认为问题出在使用 POST 上,因为使用 GET 可以正常工作,URL() 但我尝试使用HttpClientGET 来执行 GET,但它也卡住了。
  • 我使用 Wireshark 检查发送到代理的数据包,我看到当使用URL()Wireshark 时,将对代理的调用识别为从代理执行 GET 的请求。但是当使用 httpClient 时,看起来请求没有很好地构建,因为 Wireshark 显示了一个数据包但无法识别内部请求。
  • 然后我尝试使用构建POST HttpURLConnection,它通过代理,我从服务器得到答案,但看起来我没有很好地构建它,因为appengine找不到我发送的文件(但这将是另一个问题.. .)。

结论

有同样问题的人吗?任何想法?

4

1 回答 1

1

您的代理设置适用于 Java 系统类。Apache HttpClient 应该以不同的方式配置。此链接可能会有所帮助:代理身份验证

于 2013-02-05T00:49:10.850 回答