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。。。