【问题标题】:Microserivce Using Spring Boot to Consume SOAP微服务使用 Spring Boot 消费 SOAP
【发布时间】:2018-04-06 16:34:39
【问题描述】:

我需要创建一个首先使用 SOAP 的 REST 服务。最好的方法是什么?

我想使用Spring Boot创建一个微服务,但我有几个问题想请教有经验的人:

  • 我应该考虑使用哪些其他架构或技术 (带弹簧靴)?
  • 有这方面的标准技术栈吗?
  • 我应该注意哪些陷阱?

【问题讨论】:

    标签: java rest spring-boot soap microservices


    【解决方案1】:

    我应该考虑使用哪些其他架构或技术(使用 Spring Boot)?

    我的回答是,如果你只是想简单地提供 RESTful 服务 如果没有 Spring Cloud,那么我认为您可以参考以下 2 Spring官方网站上的教程来实现这一点:

    Building a RESTful Web Service
    Consuming a SOAP web service

    有这方面的标准技术栈吗?

    目前,我建议您使用 Spring Boot 作为首选。因为这些都是网络上的丰富资源,并且确实减少了开发工作量。

    我应该注意哪些陷阱?

    如果你最终选择了Spring Boot,请熟悉它的组件,你可以从Guides开始了解它是如何工作的。或者你可以把 Spring Boot 和传统的 Spring 框架混为一谈。

    【讨论】:

      【解决方案2】:

      在我们的项目中也有类似的案例,我们是用spring组件来做的。据我了解,您想打开一个最有可能接受 json 对象的 REST 端点,并且您想在该请求中发出一个SOAP Web 服务请求,然后您想返回一个包含来自soap 响应的信息的响应。要发出肥皂请求,您可以使用 Spring Web 服务 - WebServiceTemplate。它会将您的对象编组为 xml 并为您发出肥皂请求。当然,您可以使用其他一些 Web 服务框架,例如 apache cxf,它可能最适合某些特殊情况,但我会在使用 Spring 时首先尝试使用来自 Spring 家族的框架。如果外部系统运行不正常或网络出现问题,您应该在 webservicetemplate 对象上设置 超时值,以免等待太久。因为它直接影响您的系统性能。同样在这里,我建议您实施 断路器模式 以使您的系统更加健壮。您应该始终将您的系统性能与您集成的其他系统隔离开来,在这种情况下,您可以通过执行上述操作来做到这一点。

      【讨论】:

        【解决方案3】:

        据我所知,您应该使用带有 Maven 构建的 Spring Boot 应用程序。 为了向 SOAP Web 服务发送 REST 调用并返回 JSON 响应,您需要按顺序执行所有这些步骤:

        1. 业务逻辑:将标头、查询参数、正文变量等 JSON 字段映射到 XML 请求必填字段(使用 pojo 类或对象映射器)原因:由于 SOAP 端点只接受 XML 请求.

        2. 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.
          
        3. responseEntity.getBody()是un-marshalling后的XML响应,可以使用mapper提取。

               XML_BaseResponse response=mapper.readValue(responseEntity.getBody(), XML_BaseResponse.class);
          
        4. 业务逻辑:从 XML_BaseResponse 中提取必要的字段,并使用 setter 或 getter 的函数,在响应中设置必填字段。

               baseResponse.setName(xml_baseResponse.getPersonsName());
               baseResponse.setAddress(xml_baseResponse.getAddress());
               baseResponse.setCity(xml_baseResponse.getcityName());
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-20
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          • 1970-01-01
          • 2018-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多