使用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 楼答案
代理设置是针对Java系统类的。Apache HttpClient应该以不同的方式进行配置。 此链接可能有帮助:Proxy authentication