有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用httpclient通过http代理(squid)将文件发布到google应用程序的JAVA在调用execute时遇到了问题

上下文

我有一个桌面JAVA应用程序,用于将文件(blob)上传到google应用程序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 ();

在这里,我们准备了多部分post:

    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()可以很好地工作 但是我尝试使用HttpClient执行GET,它也被卡住了
  • 我使用Wireshark检查发送到代理的数据包,我发现在使用URL()时,Wireshark将对代理的调用识别为从代理执行GET的请求。但是,当使用httpClient时,请求似乎没有很好地构建,因为Wireshark显示了一个数据包,但无法识别内部请求
  • 然后我尝试使用HttpURLConnection构建帖子,它通过代理,我从服务器得到了答案,但看起来我构建得不好,因为appengine没有找到我发送的文件(但这将是另一个问题…)

结论

有人有同样的问题吗?有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

    代理设置是针对Java系统类的。Apache HttpClient应该以不同的方式进行配置。 此链接可能有帮助:Proxy authentication