创建客户端
现在,让我们编写客户端代码,这实际上是相当容易的事情(参见清单3)。通常,JAX-RPC看起来就像是您在清单3中看见的代码那样:创建服务实现,向它要求所需的Web service端口,并调用适当的方法。其中的特殊之处在于调用authorSearchRequest()方法时,您必须使用作者名初始化AuthorRequest对象。在这种情况下,您想查看书籍部分,您想要概要情况,而不是详细数据,而且您限制了搜索,让它包含关键字“Web”。您需要设置的其他重要值是开发人员令牌。出于明显的理由,我还没有在这里进行赋值!
客户端代码
清单3. JAX-RPC客户端创建了服务实现,向它要求所需的Web service端口,并调用适当的方法。
public class Client { public static void main(String[] args) { AmazonSearchService_Impl impl = new AmazonSearchService_Impl(); AmazonSearchPort port = impl.getAmazonSearchPort(); AuthorRequest authorRequest = new AuthorRequest(); authorRequest.setAuthor("Kevin Jones"); authorRequest.setDevtag("[developer token here]"); authorRequest.setMode("books"); authorRequest.setKeywords("Web"); authorRequest.setType("lite"); try { ProductInfo productInfo = port.authorSearchRequest(authorRequest); Details[] details = productInfo.getDetails(); for (int ndx = 0; ndx < details.length; ndx++) { Details detail = details[ndx]; System.out.println(detail.getProductName()); } } catch (RemoteException e) { e.printStackTrace(); } } }
URL硬编码在桩中。URL不会经常变化,但是假定您需要发送请求给另外一个URL,那该怎么办呢?您可以让一个服务位于多台服务器上,或许是出于故障恢复的理由或负载平衡的目的,或者可能您想通过跟踪工具(可以显示每个方向上正在发送的SOAP数据)发送请求和响应。要完成这些任务,您可以在桩中修改Web service地址:
AmazonSearchPort_Stub port = ( AmazonSearchPort_Stub)impl. getAmazonSearchPort(); port._setProperty( AmazonSearchPort_Stub. ENDPOINT_ADDRESS_PROPERTY, "http://localhost:9090/onca/ soap3");
注意,getAmazonSearchPort()的返回值被转给实现类而不是接口,所以我们可以设置端点地址,以便调用localhost。
然后,您可以运行一个跟踪工具,比如来自Axis的tcpmon或者我编写的HttpProxy(下载HttpProxy的代码)。这个工具被设置为监听客户端要调用的端口上的请求,并把它们转发给原来的端口(参见图3)。

public static void main( String[] args) { System.setProperty( "proxySet", "true" ); System.setProperty( "http.proxyHost", "myproxy" ); System.setProperty( "http.proxyPort", "8080" ); System.setProperty( "http.proxyUser", "xxx"); System.setProperty( "http.proxyPassword", "yyy"); ... }
Web service正在快速成为构建客户端/服务器应用程序的一项标准。编写Web service有多种方式,包括手写和使用工具包。有各种可用于Java的工具包,包括开源的Axis和Sun编写的JAX-RPC。关于通过使用wscompile读取WSDL和生成必需的客户端代码,并使用JAX-RPC来实现Web service客户端,我们已经接触到了其方方面面。下一步将是了解如何编写服务器。请参见“编写一个Web service服务器”一文。
我们尚未讨论的还有一些其他的方面,比如管理HTTP会话、HTTP身份验证和管理错误,以及各种Java规范,比如SOAP with Attachments API for Java (SAAJ)和Java Architecture for XML Binding (JAXB),在Web service领域中所扮演的角色。对于Web service也有讲解不够深入的方面,比如管理附件,理解WSDL,以及rpc/encoded和document/literal风格服务之间的差别。我们将来会对这些主题进行更为深入的探讨。