4

SOAPUI で以下をテストしたところ、同じ URL と認証資格情報を使用して期待どおりに動作する (つまり、200 ステータスを返す) ように見えることに注意してください。SOAPUI で問題なく動作するという事実は、それが https であるという事実を処理するためにリクエストを作成するときに、何か特定のことを行う必要があると私に思わせます。

次の方法を使用して、DefaultHttpClient (v4.2.3) を使用して URL への POST を試みます。

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 ステータスと Bad Request メッセージで応答していることです。

[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 を使用している他の URL に正常に投稿したことです。問題なく動作します。

私が調査を続けている間、サーバー管理者はそれを端から見ていますが、SOAPUIで機能するという事実は、私が別のことをする必要があると思います。

SOAPUI が Apache-HttpClient v4.1.1 を使用しているのに対し、私は 4.2.3 を使用していることに気付いたので、4.1.1 に切り替えましたが、違いはありませんでした。したがって、SOAPUI は、私が模倣する必要があるカバーの下で別のことをしていると推測しています。

アドバイスできる SOAPUI 開発者はいますか?

4

2 に答える 2

0

おそらく、手動でヘッダーを追加するのではなく、HttpClient のプリエンティブ認証を有効にする必要があります。Authorization

Apache HttpClient 4 を使用したプリエンプティブ Basic 認証も参照してください。

于 2013-02-26T16:04:31.647 に答える
0

Sun Base64 エンコーダーは、特定の文字数の後に改行を追加します。エンコードされたユーザー名/パスワードが長すぎると、壊れた認証ヘッダーが送信されます。エンコード認証値から空白を削除しようとしています。(補足として、常に明示的なエンコーディングを使用する必要がありますString.getBytes()

String encodedUserNameAndPassword = new sun.misc.BASE64Encoder()
    .encode(usernameAndPassword.getBytes("UTF-8"))
    .replaceAll("\\s+", "");

そうは言っても、Apache http クライアントがこれを処理できると確信しています。おそらくこの例に従っているはずです。

于 2013-02-26T16:30:03.430 に答える