wsdl返回json格式数据call.setreturntype里应该是什么?
时间: 2024-02-20 20:58:36 浏览: 13
如果你想让 WSDL 返回 JSON 格式的数据,你需要使用一个 Web 服务框架,例如 Apache CXF 或 Spring Web Services。然后,将返回类型设置为 JSON 对象或字符串类型。在 Apache CXF 中,你可以使用 @Produces 注解来指定返回类型,例如:
```java
@Produces(MediaType.APPLICATION_JSON)
public MyResponseObject myWebServiceMethod(MyRequestObject request) {
// method implementation
}
```
在 Spring Web Services 中,你可以使用 @ResponsePayload 注解指定返回类型,例如:
```java
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "MyRequestObject")
@ResponsePayload
public MyResponseObject myWebServiceMethod(@RequestPayload MyRequestObject request) {
// method implementation
}
```
无论哪种方式,你都需要设置返回类型为 JSON 对象或字符串类型。
相关问题
wsdl4j 简单实用java调用WSDL接口,并解析返回数据格式
要使用wsdl4j实现Java调用WSDL接口,需要先添加wsdl4j依赖包。可以从Maven中央仓库下载最新版本的wsdl4j包,或者直接从wsdl4j的官方网站下载。
下面是一个简单的示例代码,演示如何使用wsdl4j实现Java调用WSDL接口并解析返回数据格式:
```java
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class WSDLClient {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/MyWebService?wsdl");
QName qname = new QName("http://webservice.example.com/", "MyWebService");
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(qname);
// 调用接口方法
String result = (String) call.invoke(new Object[] {"World"});
// 解析返回数据
// TODO: 解析返回的XML数据
}
}
```
在上面的代码中,我们首先创建了一个`URL`对象,指向WSDL文件的地址。然后,我们使用`QName`对象指定了服务的命名空间和服务名称。接着,我们创建了一个`Service`对象,并调用`createCall()`方法创建了一个`Call`对象。我们使用`setTargetEndpointAddress()`方法设置了目标终端地址,使用`setOperationName()`方法设置了要调用的操作名称。
在调用接口方法时,我们使用`invoke()`方法调用接口方法,并将参数传递给该方法。方法返回的结果存储在`result`变量中。
在解析返回的数据时,我们需要根据具体的返回数据格式进行解析。通常情况下,返回的数据是一个XML格式的字符串,可以使用Java中自带的`javax.xml.parsers`包解析XML数据。例如,可以使用`DocumentBuilderFactory`和`DocumentBuilder`类来解析XML数据:
```java
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
// 解析返回数据
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(result)));
// TODO: 使用document对象解析XML数据
```
以上代码示例中,我们首先创建了一个`DocumentBuilderFactory`对象和一个`DocumentBuilder`对象。然后,我们使用`builder.parse()`方法将XML字符串转换为`Document`对象。最后,我们可以使用`document`对象来解析XML数据。
当然,具体的解析方式还需要根据具体的返回数据格式进行调整。以上仅为一个简单的示例。
在下面这段样例代码中我如何改造成调用https的接口··· //样例代码,获取手机号码归属地 public static void getMobileCodeInfo() throws ServiceException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); // wsdl完整地址 call.setTargetEndpointAddress("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); /** * 设置方法名 * new QName(String namespaceURI, String localPart) namespaceURI即为wsdl中的targetNamespace, localPart即为接口名 */ call.setOperationName(new QName("http://WebXml.com.cn/", "getMobileCodeInfo")); /** * 添加参数 * addParameter方法的参数包括:参数名(namespace+参数名)、参数类型、ParameterMode(入参即为IN) */ call.addParameter(new QName("http://WebXml.com.cn/", "mobileCode"), XMLType.XSD_STRING, ParameterMode.IN); call.setUseSOAPAction(true); // SOAPActionURI格式为targetNamespace+方法名 call.setSOAPActionURI("http://WebXml.com.cn/getMobileCodeInfo"); // 指定返回值类型,为字符串 call.setReturnType(XMLType.XSD_STRING); call.setReturnClass(java.lang.String.class); String result = (String) call.invoke(new Object[]{"13999903152"}); System.out.println(result); }···
您可以按照以下步骤将上述样例代码改造为调用https的接口:
1. 将wsdl地址中的http替换成https,即将以下代码:
call.setTargetEndpointAddress("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
改为:
call.setTargetEndpointAddress("https://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
2. 创建SSLContext实例,并设置信任管理器TrustManager来信任所有证书:
```java
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
//...
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
}
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
```
3. 设置HttpsURLConnection默认的SSLSocketFactory和HostnameVerifier:
```java
import javax.net.ssl.HttpsURLConnection;
//...
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier((hostname, sslSession) -> true);
```
4. 将调用方式改为使用HttpURLConnection,即将以下代码:
String result = (String) call.invoke(new Object[]{"13999903152"});
改为:
URL url = new URL("https://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
connection.setDoOutput(true);
String soapRequest = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">\n" +
" <mobileCode>13999903152</mobileCode>\n" +
" <userID></userID>\n" +
" </getMobileCodeInfo>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
OutputStream outputStream = connection.getOutputStream();
outputStream.write(soapRequest.getBytes("UTF-8"));
String result = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
result = stringBuilder.toString();
}
System.out.println(result);
```
请注意替换代码中的mobileCode参数值和soapRequest中的namespace和方法名。同时,为了保证代码的安全性,请在实际使用过程中,不要信任所有证书,可以使用合法的证书或者自己实现TrustManager来进行证书校验。