Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Webservice with HTTPS

I've a external web service, it's works over https, I can generate java classes with wsimport but when I invnoke the service I recive the follow exception:

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.UnknownHostException: ECM01
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)...
Caused by: java.net.UnknownHostException: ECM01
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)

My class that invoke the service is something like this:

public static void main(String[] args) {
    ColleagueServiceService cs = new ColleagueServiceService();
    ColleagueService service = cs.getColleagueServicePort();

    try {
        service.getColleagues("user", "password", 1);
    } catch (Exception_Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

I tryed use SoapUI to call the webservice, but it shows another exception:

Tue Dec 18 09:40:06 BRST 2012:ERROR:org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused
org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused
at com.eviware.soapui.impl.wsdl.support.http.SoapUIMultiThreadedHttpConnectionManager$SoapUIClientConnectionOperator.openConnection(SoapUIMultiThreadedHttpConnectionManager.java:321)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport$Helper.execute(HttpClientSupport.java:236)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.execute(HttpClientSupport.java:345)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:241)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)...

Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)...

EDITED:

This webservice is mine, but it's in a external server, I saw my class ColleagueService(it wasn't me who did) it's annoted with:

@WebService(serviceName="ColleagueServiceService")
@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class ColleagueService {

The generated wsdl I've this:

<port binding="tns:ColleagueServiceBinding" name="ColleagueServicePort">
    <soap:address location="http://ECM01:80/services/ColleagueService"/>
</port>

The external server(a client) has a jboss server and an apache http server, the http server redirect all requestes by ProxyPass with path /services/ to jboss server (jboss server is the host ECM01), anyway the wsdl is wrong because the services is https and in wsdl I've http

Can anyone help? Thank you.

like image 273
Lucas Merencia Avatar asked Dec 18 '12 12:12

Lucas Merencia


1 Answers

Caused by: java.net.UnknownHostException: ECM01

Is this the host specified in the WSDL? Look for a section like this:

<wsdl:port binding="tns:FooBinding" name="FooPort">
  <soap:address location="https://ECM01/FooService"/>
</wsdl:port>

If so, you will have to set the endpoint on the port:

BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext()
    .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);

This will be in addition other tasks like providing a proxy configuration as Anders R. Bystrup mentions and (maybe) configuring SSL client certificates.


It is perfectly normal for the WSDL not to reflect the real service endpoint. Anywhere I've worked, a known bad URI is used (e.g. localhost where everything is distributed on different hosts.) Clients can set the endpoint explicitly via a configuration mechanism (see the above code for a JAX-WS client.) This allows flexibility during development and prevents the wrong host being used during staging from development to production.

That said, when using auto-generated WSDLs I think how the SOAP address element is generated is an implementation detail of your JAX-WS implementation. I'm not certain as I've never relied on it. I would refer to the documentation of your container implementation.

like image 138
McDowell Avatar answered Oct 14 '22 11:10

McDowell