使用spring框架

时间:2017-04-24 13:09:47

标签: java spring web-services soap wsdl

我必须拨打http://ip:port/ws中没有wsdl的网络服务。

我可以使用Spring框架的HTTP POST发送RestTemplate,并从服务中获取原始输入的答案。但这有点令人讨厌,这就是为什么我在没有WSDL的情况下寻找正确的方式来使用这个Web服务。

有人可以为这项任务提出“最佳实践”方法吗?

3 个答案:

答案 0 :(得分:1)

实际上没有最佳实践,重新创建WSDL或者至少XML Schema似乎是改进当前方法的唯一选择。

答案 1 :(得分:1)

如果你真的很幸运,它会返回一些一致的XML,你可能会抛出一个XPath解析器来提取你需要的位。您可以从它返回的数据中取出XML模式(在文档顶部查找名称空间声明,并查看是否可以按照它引用的URI),或者将数据放入on-行模式生成器,如this one

答案 2 :(得分:0)

我找不到最佳解决方案,并做了一些解决方法。因此,众所周知,HTTP环境中的SOAP调用是标准的HTTP POST,其HTTP正文中包含soap信封。所以我也一样。我将xml soap请求存储在不同的位置,只是不会弄乱代码:

public static final String REQ_GET_INFO = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:xyz\">" +
                                                            "   <soapenv:Header/>" +
                                                            "   <soapenv:Body>" +
                                                            "      <urn:export>" +
                                                            "         <cardholderID>%s</cardholderID>" +
                                                            "         <bankId>dummy_bank</bankId>" +
                                                            "      </urn:export>" +
                                                            "   </soapenv:Body>" +
                                                            "</soapenv:Envelope>";

在服务层中,我使用了带有所需标头的RestTemplate post调用:

@Value("${service.url}") // The address of SOAP Endpoint
private String wsUrl;

public OperationResponse getCustomerInfo(Card card) {
    OperationResponse operationResponse = new OperationResponse(ResultCode.ERROR);

    try {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "text/xml");

        HttpEntity<String> request = new HttpEntity<>(String.format(Constants.SoapRequest.REQ_GET_INFO, 
                                                                            card.getCardholderId()), headers);

        String result = restTemplate.postForObject(wsUrl, request, String.class);


        if(!result.contains("<SOAP-ENV:Fault>")) {
            // Do SOAP Envelope body parsing here
        }
    }
    catch(Exception e) {
        log.error(e.getMessage(), e);
    }

    return operationResponse;
}

有点肮脏的工作,但是对我有用:)