泉缘泉 发表于 2025-1-16 04:28:40

SpringBoot 怎样调用 WebService 接口



媒介

调用WebService接口的方式有很多,今天记载一下,利用 Spring Web Services 调用 SOAP WebService接口
一.导入依靠

      <!-- Spring Boot Web依赖 -->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <!-- Spring Web Services -->
      <dependency>
            <groupId>org.springframework.ws</groupId>
            <artifactId>spring-ws-core</artifactId>
      </dependency>

      <!-- Apache HttpClient 作为 WebService 客户端 -->
      <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
      </dependency>

      <!-- JAXB API -->
      <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
      </dependency>

      <!-- JAXB 运行时 -->
      <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.5</version>
      </dependency> 二.创建请求类和相应类

根据SOAP的示例,创建请求类和相应类
SOAP示例
请求
POST *****************
Host: **************
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://*******/DownloadFileByMaterialCode"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <DownloadFileByMaterialCode xmlns="http://*******/">
      <MaterialCode>string</MaterialCode>
      <FileType>string</FileType>
      <Category>string</Category>
    </DownloadFileByMaterialCode>
</soap:Body>
</soap:Envelope>


响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <DownloadFileByMaterialCodeResponse xmlns="http://********/">
      <DownloadFileByMaterialCodeResult>string</DownloadFileByMaterialCodeResult>
    </DownloadFileByMaterialCodeResponse>
</soap:Body>
</soap:Envelope> 根据我的这个示例,我创建的请求类和相应类,是如许的
请求类
@Data
@XmlRootElement(name = "DownloadFileByMaterialCode", namespace = "http://*******/")
@XmlAccessorType(XmlAccessType.FIELD)
public class DownloadFileByMaterialCodeRequest {
    @XmlElement(name = "MaterialCode", namespace = "http://*******/")
    private String MaterialCode;
    @XmlElement(name = "FileType", namespace = "http://*******/")
    private String FileType;
    @XmlElement(name = "Category", namespace = "http://*******/")
    private String Category;
} 相应类
@Data
@XmlRootElement(name = "DownloadFileByMaterialCodeResponse", namespace = "http://********/")
@XmlAccessorType(XmlAccessType.FIELD)
public class DownloadFileByMaterialCodeResponse {
    @XmlElement(name = "DownloadFileByMaterialCodeResult", namespace = "http://********/")
    private String DownloadFileByMaterialCodeResult;
} 三.创建ObjectFactory类

@XmlRegistry
public class ObjectFactory {
    // 创建 DownloadFileByMaterialCodeRequest 的实例
    public DownloadFileByMaterialCodeRequest createDownloadFileByMaterialCodeRequest() {
      return new DownloadFileByMaterialCodeRequest();
    }

    // 创建 DownloadFileByMaterialCodeResponse 的实例
    public DownloadFileByMaterialCodeResponse createDownloadFileByMaterialCodeResponse() {
      return new DownloadFileByMaterialCodeResponse();
    }
} 四.设置WebServiceTemplate

@Configuration
public class WebServiceConfig {

    @Bean
    public WebServiceTemplate webServiceTemplate() {
      Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
      marshaller.setContextPath("org.jeecg.modules.webservice");// 包路径,包含请求和响应对象类

      WebServiceTemplate template = new WebServiceTemplate(marshaller);

      return template;
    }
} 五.调用WebService接口


@Service
public class DownloadFileService {
    @Autowired
    private WebServiceTemplate webServiceTemplate;

    public List<ResponseJsonObject> downloadFile(String materialCode, String fileType, String category) throws JsonProcessingException {
      String uri = "http://192.168.***.***/DYDServiceTest/PlmService.asmx";// WebService 的 URL

      // 创建请求对象并设置参数
      DownloadFileByMaterialCodeRequest request = new DownloadFileByMaterialCodeRequest();
      request.setMaterialCode(materialCode);
      request.setFileType(fileType);
      request.setCategory(category);

      // 设置 SOAPAction
      String soapAction = "http://********/DownloadFileByMaterialCode";// Web 服务指定的 SOAPAction

      // 使用 SoapActionCallback 来设置 SOAPAction 头
      SoapActionCallback soapActionCallback = new SoapActionCallback(soapAction);

      // 发送 SOAP 请求并获取响应
      DownloadFileByMaterialCodeResponse response = (DownloadFileByMaterialCodeResponse)
                webServiceTemplate.marshalSendAndReceive(uri, request, soapActionCallback);

      // 获取并返回 DownloadFileByMaterialCodeResult
      String downloadFileByMaterialCodeResult = response.getDownloadFileByMaterialCodeResult();
      System.out.println(downloadFileByMaterialCodeResult);

      //字符串转换为ResponseJsonObject对象
      ObjectMapper objectMapper = new ObjectMapper();
      // 忽略未知字段
      objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      List<ResponseJsonObject> ResponseJsonObjects = objectMapper.readValue(downloadFileByMaterialCodeResult, objectMapper.getTypeFactory().constructCollectionType(List.class, ResponseJsonObject.class));

      return ResponseJsonObjects;
    }
}  六.测试代码

    @Test
    public void test1() throws JsonProcessingException {
      List<ResponseJsonObject> responseJsonObjects = downloadFileService.downloadFile("CCPT0016-QBY-7", "", "");
      for (ResponseJsonObject responseJsonObject : responseJsonObjects) {
            System.out.println(responseJsonObject.getDocName());
      }
    } 测试效果
https://i-blog.csdnimg.cn/direct/bd7a5c500ef6418499a2071d261a19f6.png

这里在附上全部文件的路劲图,可以参考一下
https://i-blog.csdnimg.cn/direct/3e27445f469844928b0c562070d40a8a.png
总结

根据接口给出的SAOP的示例,封装好对应的实体类,因为我这里的类型都是String,大家也可以根据实际情况,封装好对应的类
留意注解的参数,namespace = "http://*******/"  给接口提供的域名地址

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SpringBoot 怎样调用 WebService 接口