Java 使用spring框架使用无wsdl的SOAP web服务
我必须调用一个没有Java 使用spring框架使用无wsdl的SOAP web服务,java,spring,web-services,soap,wsdl,Java,Spring,Web Services,Soap,Wsdl,我必须调用一个没有wsdl的web服务 我可以使用Spring framework的RestTemplate发送HTTPPOST,并从服务中获取原始输入答案。但是这有点烦人,这就是为什么我在寻找不使用WSDL的正确方式来使用这个web服务 有人能为这项任务提出一种“最佳实践”方法吗?实际上没有最佳实践,重新创建WSDL或至少XML模式似乎是改进当前方法的唯一选择 如果您真的很幸运,它将返回一些一致的XML,您可以使用XPath解析器来提取所需的位。您可以从XML模式返回的数据中挑出XML模式(在
wsdl
的web服务
我可以使用Spring framework的RestTemplate
发送HTTPPOST
,并从服务中获取原始输入答案。但是这有点烦人,这就是为什么我在寻找不使用WSDL
的正确方式来使用这个web服务
有人能为这项任务提出一种“最佳实践”方法吗?实际上没有最佳实践,重新创建WSDL或至少XML模式似乎是改进当前方法的唯一选择 如果您真的很幸运,它将返回一些一致的XML,您可以使用XPath解析器来提取所需的位。您可以从XML模式返回的数据中挑出XML模式(在文档顶部某处查找名称空间声明,并查看是否可以遵循它引用的URI),或者将数据放入在线模式生成器中,如我找不到最佳解决方案,并做了一些变通。因此,我们知道HTTP环境中的SOAP调用是一个标准HTTP POST,HTTP POST主体中包含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>";
public static final String REQ_GET_INFO=“”+
" " +
" " +
" " +
%s+
“虚拟银行”+
" " +
" " +
"";
在服务层中,我使用了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;
}
@Value(“${service.url}”)//SOAP端点的地址
私有字符串wsUrl;
公共操作响应getCustomerInfo(卡){
OperationResponse OperationResponse=新的OperationResponse(结果代码错误);
试一试{
HttpHeaders=新的HttpHeaders();
添加(“内容类型”、“文本/xml”);
HttpEntity请求=新的HttpEntity(String.format(Constants.SoapRequest.REQ\u GET\u INFO,
card.getcardind()),标题);
String result=restTemplate.postForObject(wsUrl、请求、String.class);
如果(!result.contains(“”){
//在这里进行SOAP信封正文解析
}
}
捕获(例外e){
log.error(e.getMessage(),e);
}
返回操作响应;
}
虽然有点脏,但对我来说很管用:)我读到SpringWebServiceTemplate支持对远程web服务的调用,而无需使用SAAJAPI的WSDL。但是找不到关于它的任何教程/示例。另外,我已经阅读了springws参考文档,这个问题得到了回答吗?有没有一种方法可以在不使用WSDL的情况下调用SOAP web服务?@Priyanka我最终使用SOAP xml bodyOk发送HTTP POST。你有没有任何推荐人可以像你一样遵循同样的方法?@Priyanka嘿,我在上面加了一个答案检查,它是hanks 0bj3ct。我不确定需要导入哪些java包才能包含常量和OperationResponse类。请包括它们。@Priyanka Constants.SoapRequest.REQ_GET_INFO是我已经放在第一个代码块中的字符串。OperationResponse在这里没有意义,它只是特定于我的代码,您的方法可以返回任何内容,终结点将返回xml格式的一些数据,您可以对其进行分析并确定成功和错误格式,这样您就可以构建正确的逻辑来解析传入的SOAP消息。@0bj3ct您是否尝试过此处显示的解决方案:§6.2.2。发送和接收WebServiceMessage?它使用WebServiceTemplate对象的sendSourceAndReceiveToResult方法将字符串发送到URI。。。