如何在Java Web Services中处理HTTP请求?

时间:2013-05-04 16:56:32

标签: java web-services servlets

我是网络服务的新手,正在阅读Martin Kalin撰写的 Java Webservices 一书。我已经完成了它的最初基本概念并提出了一个问题:

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

这个问题是通用的,不管Metro和Axis等任何现成的框架。请考虑以下代码

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

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

3 个答案:

答案 0 :(得分:5)

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

话虽这么说,你可以(如果你真的非常想要),只使用Servlets编写一个完整的Web服务(使用其方法doGet()doPost()

例如,您可以逐字节获取HTTP请求,将其转换为String,将其解析为XML文件,然后将其解释为SOAP信封(让' s称之为" 管道工作"),然后才会开始处理实际请求(首先你真正想要的)。 / p>

完成处理实际请求后,您必须执行一些更多管道工作才能将对象转换回XML和SOAP信封(并且#39;忘记处理最终错误/异常的麻烦。

你问:

  

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

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

  

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

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

  

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

所有Java着名的Web服务API都是在Servlet API的顶层 上构建的

Servlets是第一个处理请求的人,但是这个"处理" make非常少:正如我所说的,他们只获取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:
    • 地铁
    • 的Axis2
    • CXF
    • 将JBossWS
  • JAX-RS:
    • 泽西,
    • RestEasy的;
    • CXF,
    • Restlet(名字说明了所有......)
  • 其他:
    • 弹簧-WS,
    • Spring MVC。

就像我说的那样,这只是为了指出一些。

答案 1 :(得分:2)

请求由可以处理HTTP请求的东西处理,句号。

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

只要客户端和服务器都在谈论HTTP,底层实现无关紧要,并且不需要是servlet - 它只需要谈论HTTP。

答案 2 :(得分:0)

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