【问题标题】:How are HTTP requests handled in Java Web Services?Java Web 服务中如何处理 HTTP 请求?
【发布时间】:2013-04-28 21:48:15
【问题描述】:

我是 Web 服务的新手,正在阅读 Martin Kalin 所著的Java Webservices 一书。我已经了解了它最初的基本概念并有一个问题:

假设 producer 将 HTTP 请求(包含 SOAP 消息信封)发送到 Java Web 服务 (consumer)。请求是否由 Servlet 内部处理,Servlet 提取 SOAP 消息并将其转换为相应的 Java 域对象,然后调用服务实现 bean?

这个问题是通用的,与 Metro 和 Axis 等任何现成的框架无关。只需考虑以下代码

 Endpoint.publish("webserviceURL", new CustomerServiceImpl())

现在如果消费者将请求发送到webserviceURL,它是由Servlet始终在入口点处理还是以其他方式处理? (因为这是在任何 Web 应用程序中处理 Web 请求的方式)

【问题讨论】:

  • 这是典型的“创建一个包含 Web 服务的简单 Java 6(或更高版本)应用程序”的方法。这是一个包含在 Java 附带的 JAX-WS Web 服务堆栈实现中的小型 Web 服务器。如果您需要将代码部署到 Glassfish、JBoss 或 WebLogic 等应用服务器,则需要另一种方法。
  • @Thorbjørn Ravn Andersen 是否通过“Java 随附的 JAX-WS Web 服务堆栈实现中包含的微型 Web 服务器”或其他一些框架(如 jersery 等)发布我的 Web 服务,http Web 服务请求也会仅在消费者入口点由 servlet 处理。对吗?
  • 我不知道你在问什么,对不起。

标签: java web-services servlets


【解决方案1】:

Servlet 是一个 Java 类,可以接收 HTTP 请求并返回响应,对吧?

话虽如此,您可以(如果您真的想要的话)仅使用 Servlet(使用其方法 doGet()doPost())编写一个成熟的 Web 服务。

例如,您将逐字节获取 HTTP 请求,将其转换为 String,将其解析为 XML 文件,然后将其解释为 SOAP 信封(我们称其为“plumbing工作”),然后才开始处理实际请求(你真正想要的)。

处理完实际请求后,您必须做一些更多管道工作来将对象转换回 XML 和 SOAP 信封(并且不要忘记处理最终故障/异常的麻烦)。

你问:

这个请求是由 servlet 内部处理的,它提取肥皂消息并将其转换为相应的 java 域对象 (...)

答案是。 Servlet 除了接收字节并让您在 Java 方法中操作它们(例如 doGet()doPost())之外什么都不做。您可以手动执行此操作,但将数据转换为域对象通常由 Web 服务框架完成。

现在,如果消费者将请求发送到 webservice URL,它是始终在入口点由 servlet 处理还是以其他方式处理?

第一个。它总是由入口点的 Servlet 处理。但你可能会问:

那么,像 JAX-RS、Spring-WS 或 JAX-RS 这样的 Web 服务 API 有什么意义呢?

所有 Java 著名的 Web 服务 API都建立在 Servlet API 之上

Servlet 确实是第一个处理请求的,但这种“处理”很少:正如我所说,它们只获取 HTTP 请求位并让您将它们作为 Java 方法使用。

之后,WS 框架可以为您完成许多其他管道工作。例如,他们可以获取 HTTP POST 请求并以透明的方式对您进行所有Bytes<->XML<->SOAP Envelope<->Objects 转换。它们还将帮助您定义标准故障信封、自动生成 WSDL 文件以及其他一切。

底线:

您可以仅使用 Servlet 自己完成所有工作,但使用 Web 服务框架,您不必担心所需的所有管道工作,只需创建方法来处理实际请求。

编辑:

澄清一下:Servlet绝不是唯一用 Java 处理 HTTP 请求的方法。

不过,它们是 Java EE 中的某种标准方式,因为它们是 most stable and undisputed of the Java EE APIs 之一,但当然还有其他方式 - 总是有。

我说的是最著名的框架是建立在 Servlet API 之上的,仅举几例:

  • JAX-RS:
    • 地铁
    • 轴 2
    • CXF
    • JBossWS
  • JAX-RS:
    • 球衣,
    • RESTeasy;
    • CXF,
    • Restlet(名字说明一切......)
  • 其他:
    • 弹簧-WS,
    • Spring MVC。

正如我所说,这只是指出一些。

【讨论】:

  • 您甚至不需要 servlet,例如,RestExpress。 Servlet 只是处理 HTTP 请求的一种方式,但不是唯一的方式——HTTP 只是一个协议调用。
  • 我从来没有说过 Servlet 是唯一的方法。 OP 引用了 Metro、Axis 和 Servlets,答案是关于它的。当然 HTTP 只是一个协议。我编辑了答案以使其更清楚。
  • 我想我被“它总是在入口点由 Servlet 处理”所迷惑,并且 OP 明确表示不考虑框架。
  • 既然我们谈论的是 JavaEE/Servlet/Metro/Axis/OtherFwAlike 上下文,Servlet 总是会处理它。但是,如果一个人想要例外,只是为了技术上的,不必走那么远。 javax.xml.ws.Endpoint 本身运行一个 HTTP 服务器,它不是一个 servlet 容器。尽管如此,这些 fws 是建立在 Servlet API 之上的,因此它们的正确使用将始终由它处理入口点。
【解决方案2】:

请求由可以处理 HTTP 请求的事物处理,句号。

使用 servlet 或过滤器很方便,因为管道已经以 servlet/应用程序容器的形式为您编写好了,但这不是必需的。例如,在 Netty 上运行的服务不需要遵循 servlet 规范。 (虽然 IIRC 有一层允许 Netty 直接调用 servlet。)

只要客户端和服务器都在使用 HTTP,底层实现并不重要,也不需要是 servlet,它只需要使用 HTTP。

【讨论】:

  • 但是根据我的理解,http请求只有在java容器的情况下才能被servlet处理。但是您说 Netty 是一个示例,其中 http 请求不由 servlet 处理,而是以其他方式处理。对吗?
  • @emilly HTTP 请求可以被任何可以处理 HTTP 请求的东西处理。什么是 HTTP?文本请求/响应机制。文本通过套接字进入,被解析,然后发回响应。只要从套接字读取的内容可以正确处理 HTTP,what 处理该请求就没有任何区别。 Netty 在没有 servlet 的情况下处理 HTTP 请求。如果您可以比客户端超时更快地键入,则可以手动回答。
  • 谢谢戴夫。如果您可以在 stackoverflow.com/questions/16380657/… 上提供您的见解,那将非常有帮助。
【解决方案3】:

所有的 Web 服务都在 servlet 之上工作,只有 SOAP 或 REST。根据您使用的 Web 服务框架,将配置 servlet 映射,例如 jersey、resteasy 等。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多