我是网络服务的新手,正在阅读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请求的方式)
答案 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之上的,仅举几点:
就像我说的那样,这只是为了指出一些。
答案 1 :(得分:2)
请求由可以处理HTTP请求的东西处理,句号。
使用servlet或过滤器很方便,因为已经以servlet /应用程序容器的形式为您编写了管道,但这不是必需的。例如,在Netty上运行的服务不需要遵循servlet规范。 (虽然IIRC有一层允许Netty直接调用servlet。)
只要客户端和服务器都在谈论HTTP,底层实现无关紧要,并且不需要是servlet - 它只需要谈论HTTP。
答案 2 :(得分:0)
所有Web服务都在servlet之上工作,只有SOAP或REST。根据您使用的Web服务框架,将配置servlet映射,例如jersey,resteasy等。