> For the complete documentation index, see [llms.txt](https://potoyang.gitbook.io/spring-in-action-v4/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potoyang.gitbook.io/spring-in-action-v4/untitled-9/untitled-2/untitled.md).

# 15.4.2　通过 HTTP 访问服务

这听起来像打破记录，但是我还得告诉你，访问基于 HTTP invoker 的服务很类似于我们之前使用的其他远程服务代理。实际上就是一样的。如图 15.9 所示，HttpInvokerProxyFactoryBean 填充了相同的位置，正如我们在本章所看到的其他远程服务代理工厂 bean 一样。

![图 15.9 HttpInvokerProxyFactoryBean 是一个代理工厂 bean，用于生成一个代理，该代理使用 Spring 特有的基于 HTTP 协议进行远程通信](https://3784153818-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmcjU5gG__lBrRbUxBO%2F-LnoqYTsTsYBETQJyQ9k%2F-Lnoqn1ooAGvsjQKwAXF%2F15.9%20http%20invoker%20%E9%80%9A%E4%BF%A1.jpg?alt=media\&token=ed856f65-f809-40ba-8a1f-227db78177b4)

为了把基于 HTTP invoker 的远程服务装配进我们的客户端 Spring 应用上下文中，我们必须将 HttpInvokerProxyFactoryBean 配置为一个 bean 来代理它，如下所示：

```java
@Bean
public HttpInvokerProxyFactoryBean spitterService() {
  HttpInvokerProxyFactoryBean proxy = new HttpInvokerProxyFactoryBean();
  proxy.setServiceUrl("http://localhost:8080/Spitter/spitter.service");
  proxy.setServiceInterface(SpitterService.class);
  return proxy;
}
```

与 15.2.2 小节和 15.3.2 小节的 bean 定义相对比，我们会发现几乎没什么变化。serviceInterface 属性仍然用来标识 Spitter 服务所实现的接口，而 serviceUrl 属性仍然用来标识远程服务的位置。因为 HTTP invoker 是基于 HTTP 的，如同 Hessian 和 Burlap 一样，serviceUrl 可以包含与 Hessian 和 Burlap 版本中的 bean 一样的 URL。

**难道你不喜欢对称美吗？**

Spring 的 HTTP invoker 是作为两全其美的远程调用解决方案而出现的，把 HTTP 的简单性和 Java 内置的对象序列化机制融合在一起。这使得 HTTP invoker 服务成为一个引人注目的替代 RMI 或 Hessian/Burlap 的可选方案。

要记住 HTTP invoker 有一个重大的限制：它只是一个 Spring 框架所提供的远程调用解决方案。这意味着客户端和服务端必须都是 Spring 应用。并且，至少目前而言，也隐含表明客户端和服务端必须是基于 Java 的。另外，因为使用了 Java 的序列化机制，客户端和服务端必须使用相同版本的类（与 RMI 类似）。

RMI、Hessian、Burlap 和 HTTP invoker 都是远程调用的可选解决方案。但是当面临无所不在的远程调用时，Web 服务是势不可挡的。下一节，我们将了解 Spring 如何对基于 SOAP 的 Web 服务远程调用提供支持。
