我需要将 Zimbra Soap API 用于我们正在开发的新功能。但是,我无法找到很多使用此 API 的 Java 客户端示例,而且对于需要研究的内容我总体上有点迷茫。(一般来说,我对使用 SOAP 很陌生)
基本上,我需要发送用户名并为用户获取某种 zimbra ID,使用我的 java 代码修改用户信息,然后将该数据推送回服务器。
我在服务器上找到了这个的 wsdl 文件,但我不确定从这里去哪里。任何帮助将不胜感激 - 从高级解释到示例再到详细步骤。
提前致谢!
我需要将 Zimbra Soap API 用于我们正在开发的新功能。但是,我无法找到很多使用此 API 的 Java 客户端示例,而且对于需要研究的内容我总体上有点迷茫。(一般来说,我对使用 SOAP 很陌生)
基本上,我需要发送用户名并为用户获取某种 zimbra ID,使用我的 java 代码修改用户信息,然后将该数据推送回服务器。
我在服务器上找到了这个的 wsdl 文件,但我不确定从这里去哪里。任何帮助将不胜感激 - 从高级解释到示例再到详细步骤。
提前致谢!
遗憾的是,Zimbra SOAP API 并不是真正的 SOAP。它基本上是 XML-over-HTTP。因此,您必须手动创建发送到 zimbra 的 xml 文档。
我不知道这方面的 Java 库,我做了一个Python库。
您可以使用 Zimbra 库来调用 SOAP API:
package com.example.test
import com.zimbra.common.account.ZAttrProvisioning;
import com.zimbra.common.service.ServiceException;
import com.zimbra.common.soap.AdminConstants;
import com.zimbra.common.soap.Element;
import com.zimbra.common.soap.SoapHttpTransport;
import com.zimbra.cs.account.AccountServiceException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
public class ZimbraApi {
private static SoapHttpTransport soapHttpTransport = null;
private String baseUrl = "https://mail.example.com:7071/service/admin/soap/";
public String getAdminToken(String username, String password) {
URL url = new URL(baseUrl);
soapHttpTransport = new SoapHttpTransport(url.toURI().toString());
soapHttpTransport.setVoidOnExpired(true);
Element request = Element.XMLElement.mFactory.createElement(AdminConstants.AUTH_REQUEST);
request.addAttribute(AdminConstants.E_NAME, username);
request.addAttribute(AdminConstants.E_PASSWORD, password);
Element response = soapHttpTransport.invoke(request);
String token = response.getAttribute(AdminConstants.E_AUTH_TOKEN);
soapHttpTransport.setAuthToken(token);
return token;
}
public void createAccount(String username, String password) {
Element request = Element.XMLElement.mFactory.createElement(AdminConstants.CREATE_ACCOUNT_REQUEST);
request.addAttribute(AdminConstants.E_NAME, username);
request.addAttribute(AdminConstants.E_PASSWORD, password);
soapHttpTransport.invoke(request);
}
}
端点:https://your.domain.for.zimbra/service/soap/GetIdentitiesRequest
信封香皂
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header>
<context xmlns="urn:zimbra">
<format type="xml"/>
<csrfToken>????????</csrfToken>
</context>
</soap:Header>
<soap:Body>
<GetIdentitiesRequest xmlns="urn:zimbraAccount">
<authToken>??????</authToken>
</GetIdentitiesRequest>
</soap:Body>
</soap:Envelope>
csrfToken你在 js 中的 window.csrfToken
authToken你在 cooke ZM_AUTH_TOKEN
“soap”的请求必须通过 cookie ZM_AUTH_TOKEN、JSESSIONID和ZM_TEST
使用 Jetty 客户端 API 编写代码
ContentResponse contentResponse = client.POST(endpoint)
.content(new StringContentProvider("XML envelope"))
.cookie(new HttpCookie("JSESSIONID", jSessionIdCookieValue))
.cookie(new HttpCookie("ZM_AUTH_TOKEN", authToken))
.cookie(new HttpCookie("ZM_TEST", "true"))
.send();
此外,还有许多端点
https://your.domain.for.zimbra/service/soap/GetInfoRequest
https://your.domain.for.zimbra/service/soap/GetRightsRequest
https://your.domain.for.zimbra/service/soap/CheckRightsRequest
每个端点的信封仅在子元素中更改
<GetIdentitiesRequest>
<GetInfoRequest>
<GetRightsRequest>
<CheckRightsRequest>