请注意,我在SOAPUI中测试了以下内容,它似乎按预期工作(即返回200状态),使用相同的URL和授权凭据。它在SOAPUI中工作正常的事实让我觉得我应该在构建我的请求时做一些具体的事情来处理它是https的事实。
尝试使用DefaultHttpClient(v4.2.3)使用以下方法POST到URL:
String requestUrl = "https://test.host.name:9093/ws/simple/serviceName";
HttpPost httpPost = new HttpPost(requestUrl);
String username = "username@domainname";
String password = "pass-word-string";
String usernameAndPassword = username + ":" + password;
String encodedUserNameAndPassword = new sun.misc.BASE64Encoder().encode(usernameAndPassword.getBytes());
httpPost.setHeader("Authorization", encodedUserNameAndPassword);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httpPost);
System.out.println(response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println(responseString);
EntityUtils.consume(entity);
我遇到的问题是服务器正在响应400状态和错误请求消息:
[DEBUG] wire - << "HTTP/1.1 400 Bad Request[\r][\n]"
[DEBUG] wire - << "Connection: close[\r][\n]"
[DEBUG] wire - << "Server: Jetty(6.1.26-boomi)[\r][\n]"
[DEBUG] wire - << "[\r][\n]"
如果我删除了身份验证部分,那么我会收到“401 Not Authorized”,这至少表明服务器正在等待我的请求:
[DEBUG] wire - << "HTTP/1.1 401 Unauthorized[\r][\n]"
[DEBUG] wire - << "WWW-Authenticate: Basic realm="BoomiBasicRealm"[\r][\n]"
[DEBUG] wire - << "Content-Type: text/html; charset=iso-8859-1[\r][\n]"
[DEBUG] wire - << "Cache-Control: must-revalidate,no-cache,no-store[\r][\n]"
[DEBUG] wire - << "Content-Length: 1396[\r][\n]"
[DEBUG] wire - << "Server: Jetty(6.1.26-boomi)[\r][\n]"
服务器管理员说他可以看到以下内容通过服务器日志:
SSL renegotiate denied: java.nio.channels.SocketChannel[connected local=/192.168.20.86:9093 remote=/ip.ip.ip.ip:61356]”
奇怪的是,我使用相同的代码成功发布到使用https的其他网址,虽然没有在地址中使用不同的端口,但它没有问题。
当我继续调查时,服务器管理员正在查看它,但它在SOAPUI中工作的事实让我觉得我需要做些不同的事情。
我注意到SOAPUI正在使用Apache-HttpClient v4.1.1,而我使用的是4.2.3,所以我切换到4.1.1并没有什么区别。因此,我猜测SOAPUI正在做一些我需要模仿的不同内容。
是否有任何可能提供建议的SOAPUI开发人员?
答案 0 :(得分:0)
也许您应该启用HttpClient's preemtive authorization,而不是手动添加Authorization
标题。
答案 1 :(得分:0)
太阳Base64编码器将在一定数量的字符后添加换行符。如果您的编码用户名/密码太长,您将发送一个损坏的授权标头。尝试从编码授权值中删除任何空格。 (作为旁注,您应始终使用String.getBytes()
)
String encodedUserNameAndPassword = new sun.misc.BASE64Encoder()
.encode(usernameAndPassword.getBytes("UTF-8"))
.replaceAll("\\s+", "");
那就是说,我非常确定apache http客户端可以为你处理这个问题。您可能应该关注this example。