私は非常に奇妙な問題を抱えています。 SOAP POST HTTPS経由でリクエストを実行しようとしています。コードからリクエストを送信すると、HTTP500エラーが発生します。エラーが発生したのと同じSOAP message(header and body)をコピーし、単純なcurlリクエストを使用して投稿すると、cxfログから正常に機能します。以下は私が作成する方法です。サービスクラスおよびその他の初期化
URL wsdlurl = SOAPWebServiceTransport.class.getClassLoader().
getResource("my.wsdl");
OnlinePort service= new OnlinePortService(wsdlurl).getOnlinePortPort();
Client proxy = ClientProxy.getClient(service);
// Provides WS-Security
WSS4JOutInterceptor wss4jOut = new WSS4JOutInterceptor();
wss4jOut.setProperty("action", "UsernameToken");
wss4jOut.setProperty("user", userName);
wss4jOut.setProperty("passwordType", "PasswordText");
wss4jOut.setProperty("password", password);
wss4jOut.setProperty(WSHandlerConstants.ADD_UT_ELEMENTS,
WSConstants.NONCE_LN + " " + WSConstants.CREATED_LN);
wss4jOut.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, ServerPasswordCallback.class.getName());
proxy.getEndpoint().getOutInterceptors().add(wss4jOut);
setConduitProperties((HTTPConduit) proxy.getConduit(),url);
Setconduitメソッドではsslチェック(開発環境のみ)を無視し、ヘッダーを設定しています。
TLSClientParameters tcp = new TLSClientParameters();
tcp.setDisableCNCheck(true);
// Creating Trust Manager
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public Java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
Java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
Java.security.cert.X509Certificate[] certs, String authType) {
}
} };
tcp.setTrustManagers(trustAllCerts);
conduit.setTlsClientParameters(tcp);
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAccept("*/*");
httpClientPolicy.setContentType("text/xml;charset=UTF-8");
httpClientPolicy.setHost(url.split("/")[2]);
conduit.setClient(httpClientPolicy);
どんな助けでも非常に高く評価されるでしょう。
Response-Code: 500
Encoding: ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
Headers: {connection=[close], content-type=[text/html;charset=ISO-8859-1],
Date=[Mon, 15 Jun 2015 06:42:09 GMT], Server=[Apache-Coyote/1.1],
Set-Cookie=[JSESSIONID=FF0E4F5DCA42F700FFAC46BBD039FC20; Path=/; Secure],
transfer-encoding=[chunked]}
Payload:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
> <html> <head> <meta http-equiv="Content-Type" content="text/html;
> charset=ISO-8859-1"/> <title>Error Page</title> </head> <body>Invalid
> Request </body> </html>
at org.Apache.cxf.interceptor.StaxInInterceptor.handleMessage(StaxInInterceptor.Java:79)
at org.Apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.Java:263)
at org.Apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.Java:797)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.Java:1618)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.Java:1491)
at org.Apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.Java:1399)
at org.Apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.Java:47)
at org.Apache.cxf.io.CachedOutputStream.close(CachedOutputStream.Java:188)
at org.Apache.cxf.transport.AbstractConduit.close(AbstractConduit.Java:56)
at org.Apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.Java:646)
at org.Apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.Java:62)
at org.Apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.Java:263)
at org.Apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.Java:533)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:463)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:366)
at org.Apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.Java:319)
at org.Apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.Java:88)
at org.Apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.Java:134)
Caused by: org.Apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType. Incoming portion of HTML stream:
CURLリクエスト
curl -k --header "Content-Type:text/xml; charset = UTF-8" --header "SOAPAction:" --data @ soaprequest.xml https:// url
詳細なカールログイン (もちろん、いくつかのURLポート名を変更しました0
サーバーからのエラー応答
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error Page</title>
</head>
<body>Invalid Request
</body>
</html>
SOAPはxmlで機能し、次のエラーがあることがわかります
Caused by: org.Apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType. Incoming portion of HTML stream:
これは、応答がHTMLで送信されることを意味します。Response-Code: 500 Encoding: ISO-8859-1 Content-Type: text/html;chars
したがって、Webサービスに問題がある可能性がありますSOAP UIを使用してみてください
また、このリンクは同じ問題についての非常に役立つ話になります。 https://forums.mulesoft.com/questions/27468/web-service-consumer-response-was-of-unexpected-te.html
サーバーのログにアクセスできない場合は、コードリクエストとcurlリクエストが異なるかどうかを確認してみてください。
これを行うには、 tcpmon のようなスニファを使用してhttpリクエストをスニッフィングできます。
Tcpmonは、クライアントとサーバー間のプロキシとして機能します。すべての要求をインターセプトし、各要求と応答の詳細を出力します。
Fiddler をプロキシとして使用して、両方のリクエストを比較してみてください。ヘッダーまたはリクエスト本文のいずれかに違いがある必要があります。
FiddlerはTLSをデコードすることもできます。
誰にでも頑張ってください。
ターンアラウンドは、これを達成するためにコアJava HttpURLConnectionを使用することでした。
このようなメソッドは、フレームワークなしで原因広告がWebサービス呼び出しを投稿するのに役立ちました。
public HttpURLConnection getHttpConn(String webservice_url) throws IOException {
URL endpoint = new URL(webservice_url);
URLConnection connection = endpoint.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
byte[] encodedBytes = Base64.encodeBase64((getUsername()+":"+getPassword()).getBytes());
httpConn.setRequestMethod(getRequestMethod());
httpConn.setRequestProperty(HTTP_ACCEPT_ENCODING, getAccept_Encoding());
httpConn.setRequestProperty(HTTP_CONTENT_TYPE, getContentType());
httpConn.setRequestProperty(getContent_Length(), getContent_Length());
httpConn.setRequestProperty(HTTP_Host, getHost());
httpConn.setRequestProperty(getConnection(), getConnection());
httpConn.setRequestProperty(HTTP_COOKIE2, getCookie2());
httpConn.setRequestProperty(HTTP_COOKIE, getCookie());
httpConn.setRequestProperty("Authorization", "Basic "+new String(encodedBytes));
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
return httpConn;
}
必ずCXF構成ファイル(cxf.xml)でhttpクライアントを構成してください。
Apache CXFドキュメントに記載されているとおり:
1.http-conduit名前空間とxsdを追加します。
<beans ...
xmlns:http-conf="http://cxf.Apache.org/transports/http/configuration
...
xsi:schemaLocation="...
http://cxf.Apache.org/transports/http/configuration
http://cxf.Apache.org/schemas/configuration/http-conf.xsd
...">
2. http-conduitタグ/要素を追加し、RecieveTimeout/ConnectionTimeoutを180000msに設定します。
<http-conf:conduit name="*.http-conduit">
<http-conf:client
ConnectionTimeout="300000"
ReceiveTimeout="300000"/>
</http-conf:conduit>
最近、あなたと同じような問題に直面しました。依存関係に2つのアーティファクトを追加しました。
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
WSDLURLを確認してください。
URLは?wsdlまで指定する必要があります