我必须拨打http://ip:port/ws中没有wsdl
的网络服务。
我可以使用Spring框架的HTTP POST
发送RestTemplate
,并从服务中获取原始输入的答案。但这有点令人讨厌,这就是为什么我在没有WSDL
的情况下寻找正确的方式来使用这个Web服务。
有人可以为这项任务提出“最佳实践”方法吗?
答案 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;
}
有点肮脏的工作,但是对我有用:)