【发布时间】:2018-04-06 16:34:39
【问题描述】:
我需要创建一个首先使用 SOAP 的 REST 服务。最好的方法是什么?
我想使用Spring Boot创建一个微服务,但我有几个问题想请教有经验的人:
- 我应该考虑使用哪些其他架构或技术 (带弹簧靴)?
- 有这方面的标准技术栈吗?
- 我应该注意哪些陷阱?
【问题讨论】:
标签: java rest spring-boot soap microservices
我需要创建一个首先使用 SOAP 的 REST 服务。最好的方法是什么?
我想使用Spring Boot创建一个微服务,但我有几个问题想请教有经验的人:
【问题讨论】:
标签: java rest spring-boot soap microservices
我应该考虑使用哪些其他架构或技术(使用 Spring Boot)?
我的回答是,如果你只是想简单地提供 RESTful 服务 如果没有 Spring Cloud,那么我认为您可以参考以下 2 Spring官方网站上的教程来实现这一点:
有这方面的标准技术栈吗?
目前,我建议您使用 Spring Boot 作为首选。因为这些都是网络上的丰富资源,并且确实减少了开发工作量。
我应该注意哪些陷阱?
如果你最终选择了Spring Boot,请熟悉它的组件,你可以从Guides开始了解它是如何工作的。或者你可以把 Spring Boot 和传统的 Spring 框架混为一谈。
【讨论】:
在我们的项目中也有类似的案例,我们是用spring组件来做的。据我了解,您想打开一个最有可能接受 json 对象的 REST 端点,并且您想在该请求中发出一个SOAP Web 服务请求,然后您想返回一个包含来自soap 响应的信息的响应。要发出肥皂请求,您可以使用 Spring Web 服务 - WebServiceTemplate。它会将您的对象编组为 xml 并为您发出肥皂请求。当然,您可以使用其他一些 Web 服务框架,例如 apache cxf,它可能最适合某些特殊情况,但我会在使用 Spring 时首先尝试使用来自 Spring 家族的框架。如果外部系统运行不正常或网络出现问题,您应该在 webservicetemplate 对象上设置 超时值,以免等待太久。因为它直接影响您的系统性能。同样在这里,我建议您实施 断路器模式 以使您的系统更加健壮。您应该始终将您的系统性能与您集成的其他系统隔离开来,在这种情况下,您可以通过执行上述操作来做到这一点。
【讨论】:
据我所知,您应该使用带有 Maven 构建的 Spring Boot 应用程序。 为了向 SOAP Web 服务发送 REST 调用并返回 JSON 响应,您需要按顺序执行所有这些步骤:
业务逻辑:将标头、查询参数、正文变量等 JSON 字段映射到 XML 请求必填字段(使用 pojo 类或对象映射器)原因:由于 SOAP 端点只接受 XML 请求.
Service Broker 逻辑:导入“org.springframework.web.client.RestTemplate”并使用
**ResponseEntity<String> responseEntity=RestTemplate.exchange(endPointURL, HttpMethod.GET/POST/PUT/DELETE, HttpEntity/headers, uriVariables)**
**endpointURL** -- SOAP End point URL ,that the REST service has to consume.
**HTTPMethod** -- Method Type such as GET ,PUT ,POST ,DELETE etc.
**HTTPEntity** -- Soap requires for mandatory sender/headers/{a}.Make sure that you set your header name and value as key-Valye pair in HTTP headers.
**uriVariables** -- (Object... urivariables) such as String.class ,Integer.class
You should also put the **connectTimeout** ,**isSSLDisabled**,**responseCached** elements while generating request to restTemplate.
responseEntity.getBody()是un-marshalling后的XML响应,可以使用mapper提取。
XML_BaseResponse response=mapper.readValue(responseEntity.getBody(), XML_BaseResponse.class);
业务逻辑:从 XML_BaseResponse 中提取必要的字段,并使用 setter 或 getter 的函数,在响应中设置必填字段。
baseResponse.setName(xml_baseResponse.getPersonsName());
baseResponse.setAddress(xml_baseResponse.getAddress());
baseResponse.setCity(xml_baseResponse.getcityName());
【讨论】: